导航:首页 > 源码编译 > 校验算法的缺点是

校验算法的缺点是

发布时间:2022-10-16 20:02:17

⑴ 2010电子商务师模拟试题及答案

一、单选题
1.中央处理单元(CPU)的两个主要组成部分是运算器和()。C
(A)寄存器
(B)主存储器
(C)控制器
(D)辅助存储器

2.计算机网络是用通信线路把分散布置的多台独立计算机及专用外部设备互连,并配以相应的()所构成的系统。D
(A)系统软件
(B)应用软件
(C)操作系统
(D)网络软件

3.下列电子商务网站中,()属水平B2B电子商务。(C)
(A)Dell电脑
(B)Cisco
(C)环球资源网
(D)上海书城

4.网络广告策略属于()的研究范围。D
(A)价格策略
(B)渠道策略
(C)产品策略
(D)促销策略

5.()是指利用交通工具一次向单一目的地长距离地运送大量货物的移动。(C)
(A)运输
(B)配送
(C)输送
(D)物流

6.在市内运输中,由生产厂经由物流企业(如配送中心)为用户提供商品时,从配送中心到用户之间的物品空间移动称为()。(C)
(A)运输
(B)输送
(C)配送
(D)物流

7.企图利用漏洞达到恶意目的的威胁代理称之为()。(B)
(A)邮件爆炸
(B)攻击
(C)漏洞
(D)威胁

8.电子商务系统()保护数据不被篡改、破坏和非法复制。 C
(A)硬件安全
(B)运行安全
(C)软件安全
(D)安全立法

9.电子商务过程中,人们需要用()来相互证明各自的身份。(C)
(A)电子邮箱账号
(B)电子指纹
(C)电子签字机制
(D)IP地址

10.典型的电子商务支付应该是()。(D)
(A)银行转帐
(B)电话支付
(C)货到付款
(D)网上支付

11.在HTML中,()是网页主体的标记。(D)
(A)<head>
(B)<title>
(C)<html>
(D)<body>

12.在 HTML中,type属性用来显示不同形状的项目符号,它使用在()标记中。(C)
(A)<ul>
(B)<p>
(C)<li>
(D)<ol>

13.在 HTML中,()标记符是非成对标记符。(A)
(A)<br>
(B)<p>
(C)<ul>
(D)<a>

14.使用外部样式文件需要在文档的头部区域使用的标记是()。(A)
(A)<link>
(B)<class>
(C)<style>
(D)<a>

15.样式表文件的后缀名是()。(A)
(A)css
(B)htm
(C)html
(D)asp

16.()无法单独存在,必须附属在HTML中执行。 A
(A)VBScript
(B)javaScript
(C)Delphi
(D)C语言

17.FTP常用的服务是()。(B)
(A)超文本传输
(B)下载
(C)ls
(D)远程登录

18.在()中计算机可以使用超终端通信。(A)
(A)对等网络
(B)广播式网络
(C)非对等网络
(D)VPN

19.()类邮件列表,只有经过邮件列表管理者许可的电子邮件才能发送给其他订户。C
(A)公开
(B)阻止
(C)管制
(D)封闭

20.移动存储设备最大的优势在于()。(C)
(A)标准存储单位成本低
(B)存储量大
(C)易保存,受外界影响更小
(D)方便易用

21.关系数据库使用()表示实体及其联系。(C)
(A)记录
(B)字段
(C)数据表
(D)SQL

22.新闻组中()顶级类别表示关于新闻组本身的主题。(B)
(A)alt
(B)news
(C)misc
(D)talk

23.网络市场调研问卷的问题一般不要超过()个。C
(A)10
(B)15
(C)20
(D)30

24.在对竞争对手的调研活动中,() 发挥着重要作用。(B)
(A)网上直接调研
(B)网上间接调研
(C)E-mail问卷
(D)Focus-Group

25.在网络调研中,()一般用来再次向填写者表示感谢或致意,此外注明公司的标志性信息(如公司名称、网站、联系方式),这是宣传公司形象的好机会。(D)
(A)卷首说明
(B)调研问题
(C)调研内容
(D)结束语

26.()主要是为顾客提供一个友好的购物环境,包括用户注册、店面浏览,商品定购等部分。(A)
(A)前台商务系统
(B)后台商务系统
(C)店面管理系统
(D)站点管理系统

27.()是为了让上网的用户不用等到多媒体文件完全下载完就开始播放的一种技术。D
(A)条形码技术
(B)射频技术
(C)多媒体技术
(D)动画流技术

28.因为网络广告()的特征,使得公司在网络上许多位置放置公司的广告和相关产品介绍。(C)
(A)回馈快
(B)效率高
(C)成本低
(D)交互强

29.物流信息系统分析工作的总结称之为()。(B)
(A)物流环境分析报告
(B)信息分析报告
(C)数据流分析报告
(D)业务分析报告

30.在网上单证设计过程中,要注意保证订单在商城未确认前的()。(C)
(A)可转换性
(B)可传递性
(C)可修改性
(D)可追述性

31.客户的购买记录属于()信息。(D)
(A)客户的静态
(B)客户的操作
(C)客户的动态
(D)客户的行为

32.电子合同是通过计算机网络系统订立的、以()的方式生成、储存或传递的合同。(D)
(A)数据文件
(B)数字电文
(C)数字文件
(D)数据电文

33.数字化信息附着在软件光盘上,称为()。A
(A)有形信息产品
(B)无形信息产品
(C)非信息产品
(D)信息服务

34.在电子商务中,合同的()发生了极大的变化。(C)
(A)意义
(B)作用
(C)形式
(D)功能

35.()是SSL协议的基本特点。(D)
(A)能对通信双方的身份进行认证
(B)进行协商的双方的秘密是安全的
(C)协商是可靠的
(D)连接是专用的

36.SET协议是在()之上的应用层的网络标准协议。(D)
(A)数据链路层
(B)物理层
(C)传输层
(D)对话层

37.安全电子交易是基于互联网的支付,是授权业务信息传输的安全标准,它采用()公开密钥体系对通信双方进行认证。(D)
(A)HASH
(B)DES
(C)RC4
(D)RSA

38.下列属于网络客户服务工具的是()。A
(A)FAQ
(B)ERP
(C)CRM
(D)SCM

39.()是指完成交易之后为顾客提供的服务。主要包括产品的技术支持和技术服务及为客户提供的增值服务。(D)
(A)售前服务
(B)售中服务
(C)售后服务
(D)沟通服务

40.网络客户反馈信息通常都是以()方式传递的。(B)
(A)电话
(B)E-mail
(C)上门访问
(D)邮局邮件

41.()条形码包括生产日期、有效日期、运输包装的序号、重量、地址等信息。(D)
(A)EAN-13
(B)DUN-14
(C)DUN-16
(D)EAN-128

42.配装成本中包括()。A
(A)配装材料费用
(B)配送间接费用
(C)物流中心制造费用
(D)分拣设备折旧费用

43.物流运输企业与供应链参与各方整合在一起形成( )。(C)
(A)物流企业
(B)供应链结合体
(C)第三方物流
(D)物流供应链

44.条码是由一组规则的、不同宽度的条和空组成的标记,其中对光线反射率低的是( )。(A)
(A)条
(B)空
(C)相同
(D)粗条

45.电子订货系统简称是()。(D)
(A)POS
(B)EPS
(C)GPS
(D)EOS
46.()属于物流组织结构与功能分析的主要内容。(A)
(A)物流数据分析
(B)组织结构分析
(C)业务过程与组织结构之间的联系分析
(D)业务流程分析

47.应用()技术的车辆运行管理系统只适用于小范围的通信联络。A
(A)MCA
(B)通信卫星
(C)GPS
(D)GIS

48.企业采购和付款业务循环内部控制使用的基本文件中,()是由采购部门编制的授权供应方提供商品的预先编号的文件。(B)
(A)请购单
(B)订单
(C)验收单
(D)借项通知单

49.采购申请模块的功能包括()。D
(A)对于已通过的采购申请,邮件通知申请者
(B)对于已通过的采购申请,提交给采购管理模块
(C)制定年度或月份采购计划
(D)接受企业ERP系统自动提交的原材料采购申请

50.报价采购中,报价单的有效期是指()。(A)
(A)报价送达对方所在地时的日期
(B)报价日期
(C)报价单发送日期
(D)开标日期

51.逾期率是供应商评价指标中的()指标。(C)
(A)价格
(B)品质
(C)交期交量
(D)配合度

52.()是企业对供应商最基本的行为约束,也是二者保持合作关系的基本保障。(C)
(A)供应商评价体系
(B)供应商考核体系
(C)供应商行为准则
(D)供应商行业规范

53.设计加密系统时,真正需要保密的是()。A
(A)密钥
(B)加密算法
(C)解密算法
(D)密文

54.使用DES算法加密的算法步骤是( )。(A)
(A)将明文分组、初始置换,迭代过程,逆初始置换,输出64位码的密文
(B)初始置换,将明文分组、逆初始置换,迭代过程,输出64位码的密文
(C)初始置换,迭代过程,将明文分组、逆初始置换,输出64位码的密文
(D)将明文分组、初始置换,逆初始置换迭代过程,,输出64位码的密文

55.在安全电子邮件中,收信的协议是( )。(C)
(A)SMTP
(B)HTTP
(C)POP3
(D)FTP

56.OSI是( )。(B)
(A)国际标准化组织
(B)安全体系结构
(C)质量管理体系
(D)国家标准的环境管理体系

57.瞬时复制技术是( )。(A)
(A)使计算机在某一灾难时刻自动复制数据的技术
(B)快速产生和维护一份或多份数据库数据的复制
(C)在远程备份中心提供主数据中心的磁盘镜像
(D)人工快速复制备份数据

58.用特征代码法检测病毒()。(C)
(A)能检测未知病毒
(B)误报率高
(C)可识别病毒的名称
(D)不能做解毒处理

59.引导型病毒将病毒寄生在硬盘( )。(A)
(A)逻辑0扇区或软件0扇区
(B)逻辑1扇区或软件1扇区
(C)逻辑2扇区或软件2扇区
(D)逻辑3扇区或软件3扇区

60.判断病毒的触发条件,实施病毒的破坏功能的模块是( )。(C)
(A)传染模块
(B)引导模块
(C)表现模块
(D)以上都不是

二、多选题
61.计算机网络的分类标准很多,按拓扑结构可分为()。(BCD)
(A)广播型
(B)星型
(C)总线型
(D)环型

62.电子商务的基本组成要素包括用户、商家以及()等。(ABCD)
(A)物流配送
(B)认证中心
(C)银行
(D)网络

63.网络产品策略包括()。AD
(A)产品选择策略
(B)网络直销策略
(C)网络广告策略
(D)销售服务策略

64.计算机信息系统安全产品是用来保护计算机信息系统安全的专用的硬件和软件产品,如()。(AC)
(A)网络防火墙
(B)解密软件
(C)防病毒软件
(D)压缩软件

65.在电子商务条件下,买方应当承担的义务包括()。(ABD)
(A)按照网络交易规定方式支付价款的义务
(B)按照合同规定的时间、地点和方式接受标的物的义务
(C)对标的物的质量承担担保义务
(D)对标的物验收的义务

66.下列关于字体标记color属性的描述正确的有()。 ACD
(A)定义文字的颜色
(B)定义文字的字体
(C)可以用颜色的英文名称表示颜色
(D)可以用16进制的RGB代码表示颜色

67.在 HTML中,()是表格使用的标记。(BCD)
(A)<ul>
(B)<table>
(C)<tr>
(D)<td>

68.在FrontPage中,能加入DHTML效果的事件有()。(ABCD)
(A)单击
(B)双击
(C)鼠标悬停
(D)网页加载

69.关于CSS的应用,正确的说法有()。(ABCD)
(A)外部样式是独立的CSS文件
(B)内联式样式只包含在与它有关的标记内
(C)应用嵌入式样式,要将CSS代码置于<HEAD>和</HEAD>之间
(D)应用嵌入式样式,要将CSS代码置于<!--和-->之间

70.网络下载软件JetCar具有的特点包括()。(ACD)
(A)支持断线续传
(B)能创建有限数目的类别
(C)支持MMS和RTSP协议
(D)具有预防病毒侵害的安全机制

71.下列关于音频技术的描述正确的有()。 BCD
(A)存储介质磁性变化不影响模拟音频的回放质量
(B)MIDI音乐是电脑特有的
(C)数字音频技术将声波波形转换成二进制数据
(D)Sound Forge是一种音频编辑工具

72.以下()SQL语句属于数据操纵语言。(BD)
(A)Alter
(B)Select
(C)Create
(D)Update

73.撰写网络市场调研计划书需要()。ABCD
(A)确定调研的目标和范围
(B)制定调研计划
(C)说明调研人员组成
(D)明确调研时间和资金限制

74.网上市场调研项目的范围包括(ABCD)
(A)背景
(B)目的
(C)委托人
(D)项目负责人

75.网上市场调研的相关计划有()。(ABC)
(A)时间计划
(B)沟通计划
(C)人力资源计划
(D)营销计划

76.网络感性诉求广告的创意方法有()。(ABC)
(A)感知效应
(B)情趣效应
(C)情感效应
(D)利益效应

77.进行网上购物的消费者可以分为()等类型。(ABCD)
(A)简单型
(B)冲浪型
(C)议价型
(D)接入型

78.设计网上商店单证种类和格式需要()AB
(A)列出所需网上单证种类的名称
(B)列出各种单证的有关数据项
(C)列出各网上单证为方便客户所需要的提示语内容
(D)确定各网上单证色彩、字体、字形

79.网上订单的后台处理的过程主要包括()等。(ACD)
(A)订单准备
(B)订单传递
(C)订单储存
(D)订单登录

80.认证机构一般需承担()。(ABCD)
(A)信息披露义务
(B)信息通知义务
(C)安全义务
(D)举证义务

81.电子合同的特点有()。ACD
(A)电子数据易消失
(B)电子数据不易改动
(C)电子合同局限性
(D)可能受到计算机病毒攻击

82.SET最初是由()合作开发完成的。(AB)
(A)VISA CARD
(B)MASTER CARD
(C)AMERICAN EXPRESS CARD
(D)CITIBANK CARD

83.SET通过使用()方式加密保证了数据的保密性。(AD)
(A)公共密钥
(B)公开密钥
(C)私有密钥
(D)对称密钥

84.处理客户投诉的原则包括()。ABCD
(A)预防原则
(B)及时原则
(C)责任原则
(D)管理原则

85.FAQ是指利用网站页面向顾客提供有关()等问题的现成答案。(ABC)
(A)产品的使用
(B)技术支持
(C)企业情况
(D)订单状态

86.网上售后服务的主要特点包括()。(ABCD)
(A)方便
(B)直接
(C)个性化
(D)快捷

87.条码在仓库内部管理中的作用是()。(AC)
(A)存货盘点形成盘点报告
(B)方便入库
(C)出库备货
(D)条理存放

88.物流信息按照物流的功能分类可以分为()。(ABCD)
(A)计划信息
(B)控制及作业信息
(C)统计信息
(D)支持信息

89.判定配送合理与否的因素是多方面的,()因素属于合理范畴。(BCD)
(A)资金周转慢
(B)库存周转快于原来各企业库存周转
(C)缺货次数下降
(D)即时配送速度快

90.选择配送方法包括()。BCD
(A)确定物流服务商
(B)确定配货作业方法
(C)确定车辆配装方法
(D)确定配送路线

91.企业可以()了解供应商的能力,选择合适的供应商。(ABCD)
(A)根据供应商的信誉对比类似产品的历史情况及其他用户的使用情况
(B)根据供应商提供的样品进行评价
(C)对供应商的能力进行现场调查和评价
(D)根据是否取得有关质量认证机构的质量体系认证

92.防止企业采购中暗箱操作的措施“三统一分”,其中“三统”是指所有采购商品要()。(BCD)
(A)统一控制费用
(B)统一采购验收
(C)统一审核结算
(D)统一转账付款

93.对供应商进行调查,调查表应尽量用()进行表述。(BC)
(A)文字
(B)数据
(C)量值
(D)实例

94.电子商务信息保密性需求包括()。AB
(A)信息的隐私问题
(B)交易内容的保密性
(C)服务器的真实性
(D)交易双方身份的真实性

95.对电子邮件的加密主要方法有( )。(AB)
(A)使用PGP插件
(B)使用数字证书
(C)用系统自带的加密功能
(D)用压缩加密软件

96.安全交易体系中具有代表性的交易规范协议有( )。(BC)
(A)TCP/IP
(B)SET
(C)SSL
(D)HTTP

97.支撑软件的维护需要做到()。ABCD
(A)定期清理日志文件
(B)定期清理临时文件
(C)定期执行整理文件系统
(D)处理运行中死机情况

98.计算机安全是指一种确定状态,使计算机化数据和程序文件不致被()访问、获取或修改。(BCD)
(A)授权人员
(B)计算机
(C)程序
(D)非授权人员

99.校验算法的缺点是( )。(ABD)
(A)不能识别病毒名称
(B)不能对付隐蔽性病毒
(C)不能发现未知病毒
(D)容易误报警

100.堡垒主机的系统软件可用于( )。(ABC)
(A)维护系统日志
(B)硬件复制日志
(C)远程日志
(D)用户操作日志

⑵ 什么是“2121”校验方法

2121校验应该就是利用Luhn算法

Luhn 算法或是Luhn
公式,也被称作“模10算法”。它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证。该算法是由IBM的科学家Hans
Peter Luhn所创造,于1954年1月6日提出该专利的申请,并于1960年8月23日被授予,在美国的专利号为2950048。

该算法一直都被大家所公用,并且时至今日应用也很广泛。它被指定在ISO/IEC7812-1。它的目的不是成为一种加密安全的哈希函数;它的目的是防止意外出现的错误,而不是恶意攻击。很多信用卡和众多的政府身份识别号码都使用该算法从一系列的随机数字中提取有效的数字。

优点和缺点

Luhn
算法会检测到任何单码的错误以及几乎所有的相邻数字换位的错误。但是它不会检测两个数字序列09转90的错误(反之亦然)。它会检测到十分之七的相同双位数错误(不会检测到22和55的互换,33和66的互换,44和77的互换)。其他更复杂的检查数字算法,如费尔赫夫算法,可以检测出更多的转录错误。模N的Luhn算法是Luhn算法的一个扩展,支持非数字字符串。因为该算法采取了从右向左的方式,而且零位会影响计算的结果。只有当零位造成了数位的移动或是用零来填充一串数字的开头时才不会影响计算结果的生成。因此不论在将1234用零填充为0001234之前或是之后,使用Luhn算法得到的结果都是一样的。

该算法在美国专利上是为了给手持或是机械设备计算校验码。所以它必须尽可能的简单。

非正式的解释

该公式会通过校验码对一串数字进行验证。校验码通常会被加到账户号码中,从而拼合成一个完整的账户号码。拼合后的账户号码要通过以下的测试:

1.从校验位开始计数(校验位一般添加在账户的最后面),按从右向左的顺序,将偶数都乘以2.

2.将得到的结果相加起来(例如:10=1+0=1,14=1+4=5,也有的说法是若是乘2的结果是两位数的话,那么就直接减去9,和之前位数拆开相加的结果是一样的),然后再与原数字串的奇数位相加。

3.如果加起来的和模10后为0(也就是相加的结果是以0结尾的,10的倍数),那么这个数字串根据Luhn算法来说就是有效的,反之就是无效的。

假设一个字符串为“7992739871”,我们为其加上一个校验位,最后组成的数字为7992739871x:

账户号码: 7 9 9
2 7 3
9 8 7 1 x

将偶数位乘以2:7 18 9 4 7 6 9
16 7 2
x

相加后的数字: 7 9 9 4 7 6 9 7 7
2 =67

校验码x是通过将相加后的数字乘以9后,在进行模10计算(那么就是:(67*9)mod10,也有的说法是取比相加的和最小的10的整数倍数字,其实结果都是一样的)。通俗地说:

1.计算所有位数的和(67)。

2.将其乘以9(603)。

3.取最后一位数字(3)。

4.得到的结果就是校验位。

另外一种得到校验位的方法:先计算所有位数的和,用10减去所有位数和模10的结果。(67的个位是7;10-7=3即为校验位)。通俗地说:

1.计算所有位数的和(67)。

2.取个位数(7)。

3.用10减去个位数(3)。

4.得到的结果就是校验位。

这样,我们得到的完整的账户号码是:7992739871x。

下面的每一个数字 79927398710, 79927398711, 79927398712, 79927398713, 79927398714,
79927398715, 79927398716, 79927398717, 79927398718,
79927398719都给以用如下的方法进行验证。

1.从最右边开始计算,将偶数位都乘以2:(1*2)=2,(8*2)=16,(3*2)=6,(2*2)=4,(9*2)=18

2.将每一位数字加起来:x(校验位)+(2)+7+(1+6)+9+(6)+7+(4)+9+(1+8)+7=X+67.

3.如果得到的结果是10的倍数,那么这个账户号码就可能是有效的。需要注意的是3就是唯一的可以使得和(67+x)是10的整数倍的个位数。

4.因此,以上的所有账户除了79927398713 是有效的以外,其他均为无效的账户。

校验位的验证的代码实现

以下通过Python来实现的:

def luhn_checksum(card_number):

def digits_of(n):

return [int(d) for d in str(n)]

digits = digits_of(card_number)

odd_digits = digits[-1::-2]

even_digits = digits[-2::-2]

checksum = 0

checksum += sum(odd_digits)

for d in even_digits:

checksum += sum(digits_of(d*2))

return checksum % 10

def is_luhn_valid(card_number):

return luhn_checksum(card_number) == 0

校验位的计算

上面的算法检查输入校验位的有效性。计算校验位需要一个小的适应算法,即:

1.切换奇/偶乘法。

2.如果得到的和(sum)模10等于0的话,那么校验码就是0。

3.否则,校验码就等于10减去得到的和模10(10 - (sum mod 10))

def calculate_luhn(partial_card_number):

return 10 - luhn_checksum(int(partial_card_number) * 10)

⑶ DES和AES算法的比较,各自优缺点有哪些

一、数据加密标准不同

1、DES算法的入口参数有三个:Key、Data、Mode。

其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

2、AES的基本要求是,采用对称分组密码体制,密钥的长度最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。

因此AES的密钥长度比DES大, 它也可设定为32比特的任意倍数,最小值为128比特,最大值为256 比特,所以用穷举法是不可能破解的。

二、运行速度不同

1、作为分组密码,DES的加密单位仅有64位二进制,这对于数据传输来说太小,因为每个分组仅含8个字符,而且其中某些位还要用于奇偶校验或其他通讯开销。处理速度慢、加密耗时

2、AES对内存的需求非常低,运算速度快,在有反馈模式、无反馈模式的软硬件中,Rijndael都表现出非常好的性能。

三、适用范围不同

1、数据加密标准,速度较快,适用于加密大量数据的场合。DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES

2、AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。

⑷ 校验算法的缺点

校验算法不是其他人工作的简单推广,它摒弃了把已有的方法 集中到一起的想法,而是探素使用简单的代数概念来解决问题 的方法。尽管思想是简单的,但是非常有创造性。然而,这个算 法目前可能不会有太多的实际应用。这是因为算法的运行时间 是0((log n)}),与Miller和Rabin设计的概率测试的0(log rz) 运行时间相比是相形见咄的。研究者们注意到如果某个猜想被 证明,算法可以在0((logn)')时间内运行,这样的改善将促进 实际的应用。研究者们还证明如果Sophie Germain素数具有期 望的分布,那么在时间估计中的指数12可以减少到5。当然如 果发现素数的分布并非如此,那将会有很大区别。 校检算法最重要的意义是作为一个理论结果,为这一领域 的研究奠定了基础。之后在技术上将会进行改进与完善,使之 更为实用。

⑸ 哈希表、哈希算法、一致性哈希表

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数(哈希函数),存放记录的数组叫做散列表。

  优点:

        哈希表可以提供快速的操作。

缺点:

        哈希表通常是基于数组的,数组创建后难于扩展。

        也没有一种简便的方法可以以任何一种顺序〔例如从小到大)遍历表中的数据项 。

    综上, 如果不需要有序遍历数据,井且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。

        1. 使用哈希函数将被查找的键转换为数组的索引。

        2. 处理哈希碰撞冲突。

    若关键字为 k ,则其值存放在 f(k) 的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系 f 为散列函数,按这个思想建立的表为散列表。

    若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为 均匀散列函数 (Uniform Hash function),这就是使关键字经过散列函数得到一个"随机的地址",从而减少碰撞。

散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。

一个好的散列函数一般应该考虑下列因素 :

    1.计算简单,以便提高转换速度。

    2.关键词对应的地址空间分布均匀,以尽量减少冲突。

1.   直接寻址法

    取关键字或者关键字的某个线性函数值作为哈希地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b为整数),这种散列函数也叫做自身函数.如果H(Key)的哈希地址上已经有值了,那么就往下一个位置找,直到找到H(Key)的位置没有值了就把元素放进去。

2.   数字分析法

    数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。

3.   平方取中法

    取关键字平方后的中间几位作为散列地址。这种方法的原理是通过取平方扩大差别,平方值的中间几位和这个数的每一位都相关,则对不同的关键字得到的哈希函数值不易产生冲突,由此产生的哈希地址也较为均匀。该方法适用于关键字中的每一位都有某些数字重复出现频度很高的现象。

4.   折叠法

    折叠法是将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(注意:叠加和时去除进位)作为散列地址。

    数位叠加可以有移位叠加和间界叠加两种方法。移位叠加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。

    该方法适用于关键字特别多的情况。

5.   随机数法

    选择一个随机数,作为散列地址,通常用于关键字长度不同的场合。

6.   除留余数法

    取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址.即H(Key)=Key MOD p,p<=m.不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选得不好,则很容易产生冲突。

    对不同的关键字可能得到同一散列地址,即 k1≠k2 ,而 f(k1)=f(k2) ,这种现象称为碰撞(英语:Collision)。具有相同函数值的关键字对该散列函数来说称做同义词。

    通过构造性能良好的散列函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。 创建哈希表和查找哈希表都会遇到冲突,两种情况下解决冲突的方法应该一致。

下面以创建哈希表为例,说明解决冲突的方法。

1.开放寻址法

    这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:Hi=(H(key)+di)%m   i=1,2,…,m-1,其中H(key)为哈希函数,m 为表长,di称为增量序列,i为碰撞次数。增量序列的取值方式不同,相应的再散列方式也不同。增量序列主要有以下几种:

    (1) 线性探测再散列

        di=1,2,3,…,m-1

        这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。

    (2)二次探测再散列

        di=12,-12,22,-22,…,k2,-k2( k<=m/2 )

        这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。

    (3)伪随机探测再散列

        di=伪随机数序列。

    线性探测再散列的 优点 是:只要哈希表不满,就一定能找到一个不冲突的哈希地址,而二次探测再散列和伪随机探测再散列则不一定。线性探测再散列容易产生“二次聚集”,即在处理同义词的冲突时又导致非同义词的冲突。

    其实除了上面的几种方法,开放寻址法还有很多变种,不过都是对di有不同的表示方法。(如双散列探测法:di=i*h2(k))

2.再哈希法

    这种方法是同时构造多个不同的哈希函数:Hi=RHi(key),i=1,2,3,…,n。

    当哈希地址H1=RH1(key)发生冲突时,再计算H2=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

 3.链地址法(拉链法)

    这种方法的基本思想是将所有哈希地址相同的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表(数组)中,因而查找、插入和删除主要在同义词链中进行。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。链地址法适用于经常进行插入和删除的情况。

     拉链法的优点

        与开放寻址法相比,拉链法有如下几个优点:

            (1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;

            (2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;

            (3)开放寻址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中理论上可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;(散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度)

注:HashMap默认装填因子是0.75。

            (4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放寻址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填入散列表的同义词结点的查找路径。这是因为各种开放寻址法中,空地址单元都被理解没有查找到元素。 因此在用开放寻址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

     拉链法的缺点

        拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放寻址法较为节省空间,此时将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放寻址法中的冲突,从而提高平均查找速度。

4、建立公共溢出区

    这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表(在这个方法里面是把元素分开两个表来存储)。

    散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平均查找长度来衡量。

    查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。

影响产生冲突多少有以下三个因素:

    1. 散列函数是否均匀;

    2. 处理冲突的方法;

    3. 散列表的装填因子。

     散列表的装填因子

        定义为:α= 填入表中的元素个数 / 散列表的长度

        α是散列表装满程度的标志因子。由于表长是定值,α与"填入表中的元素个数"成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。

        实际上,散列表的平均查找长度是装填因子α的函数,只是不同处理冲突的方法有不同的函数。

    这个HASH算法不是大学里数据结构课里那个HASH表的算法。这里的HASH算法是密码学的基础,了解了hash基本定义,就不能不提到一些着名的hash算法,MD5 和 SHA-1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。

Hash算法在信息安全方面的应用主要体现在以下的3个方面:

     ⑴  文件校验

        我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗 数据篡改 的能力,它们一定程度上能检测出数据传输中的信道误码,但却不能防止对数据的恶意破坏。

        MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性 校验和 (Checksum)算法,不少Unix系统有提供计算md5 checksum的命令

     ⑵  数字签名

        Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在 数字签名 协议中,单向散列函数扮演了一个重要的角色。对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。

     ⑶ 鉴权协议

        如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。

    一致性哈希表简称DHT,主要应用于分布式缓存中,可以用来解决分布式存储结构下动态增加和删除节点所带来的问题。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N(key是数据的key,N是机器节点数),如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。

判定哈希算法好坏的四个定义 :

    1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。

    2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

    3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。 分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

    4、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的, 因此好的哈希算法应能够尽量降低缓冲的负荷。

    在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的hash取模算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。接下来主要说明一下一致性哈希算法是如何设计的。

以SpyMemcached的ketama算法来说,思路是这样的:

把数据用hash函数,映射到一个很大的空间里,如图所示。数据的存储时,先得到一个hash值,对应到这个环中的每个位置,如k1对应到了图中所示的位置,然后沿顺时针找到一个机器节点B,将k1存储到B这个节点中。

如果B节点宕机了,则B上的数据就会落到C节点上,如下图所示:

这样,只会影响C节点,对其他的节点A,D的数据不会造成影响。然而,这又会造成一个“雪崩”的情况,即C节点由于承担了B节点的数据,所以C节点的负载会变高,C节点很容易也宕机,这样依次下去,这样造成整个集群都挂了。

为此,引入了“虚拟节点”的概念:即把想象在这个环上有很多“虚拟节点”,数据的存储是沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点,如下图所使用:

图中的A1、A2、B1、B2、C1、C2、D1、D2都是虚拟节点,机器A负载存储A1、A2的数据,机器B负载存储B1、B2的数据,机器C负载存储C1、C2的数据。由于这些虚拟节点数量很多,均匀分布,因此不会造成“雪崩”现象。

⑹ 关于CRC效验

为保证传输过程的正确性,需要对通信过程进行差错控制。差错控制最常用的方法是自动请求重发方式(ARQ)、向前纠错方式(FEC)和混合纠错(HEC)。在传输过程误码率比较低时,用FEC方式比较理想。在传输过程误码率较高时,采用FEC容易出现“乱纠”现象。HEC方式则是ARQ和FEC的结合。在许多数字通信中,广泛采用ARQ方式,此时的差错控制只需要检错功能。实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。但这些方法都有各自的缺点,误判的概率比较高。
循环冗余校验CRC(Cyclic Rendancy Check)是由分组线性码的分支而来,其主要应用是二元码组。编码简单且误判概率很低,在通信系统中得到了广泛的应用。下面重点介绍了CRC校验的原理及其算法实现。

CRC校验可以100%地检测出所有奇数个随机错误和长度小于等于k(k为g(x)的阶数)的突发错误。所以CRC的生成多项式的阶数越高,那么误判的概率就越小。

CRC代码的一些基本概念和运算:

CRC多项式:

例:

代码:1010111 对应的多项式为:X6+X4+X2+X+1

多项式X5+X3+X2+X1+1对应的代码为101111

CRC生成多项式:

首位和最后一位必须是1。CRC生成多项式是给定的,在传输过程中不变,即发送和接收端生成码相同。

一些常用的校验码为:

CRC8=X8+X5+X4+1

CRC-CCITT=X16+X12+X5+1

CRC16=X16+X15+X5+1

CRC12=X12+X11+X3+X2+1

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1

CRC的运算本质是异或运算(模2除法)

例:原信息码为1011001

生成码为11001

校验码计算过程

① 将信息码左移4位(生成码长-1);得到10110010000

② 异或运算

10110010000

11001

01111010000(前面的数进行异或运算,后面的直接抄下来)

11001

0011110000(和生成码异或运算的必须从1开始)

11001

00111000

11001

001010

这样得到的结果为1010,即为所需要的校验码,添加到信息码后,得到发送的代码为:

10110011010

我把上面的手算过程用c#写了一段程序,如下:

using System;

namespace mainClass
{
public class mainProgress
{
public static void Main()
{
byte[] msg={1,0,1,1,0,0,1};//信息码
byte[] gmsg=new byte[msg.Length+4];
crc c = new crc();
gmsg=c.code(msg);
Console.Write("编码后字符串为:");
for (int i = 0; i < gmsg.Length; i++)
{
Console.Write("{0}", gmsg[i].ToString());
}
Console.Write("\n");
byte[] gmsg1={ 1, 0, 1, 1, 0, 1, 1 };//接收到的代码
bool r = c.det(gmsg1);
if (r)
{
Console.WriteLine("传输正确");
}
else
{ Console.WriteLine("传输错误"); }
}
}

public class crc//CRC编码类
{
private byte[] g = { 1,1,0,0,1};//生成码
public byte[] code(byte[] msg)//编码
{
byte[] gmsg=new byte[g.Length+msg.Length-1];
msg.CopyTo(gmsg, 0);//
for (int i = 0; i < msg.Length; i++)//完成异或运算,即模2除法
{
if (gmsg[i] == 1)
{
for (int j = 0; j < g.Length; j++)
{
if (gmsg[i + j] == g[j])
gmsg[i + j] = 0;
else
gmsg[i + j] = 1;
}
}
}
msg.CopyTo(gmsg, 0);
return gmsg;
}
private bool f=true;

//接收端检测
public bool det(byte[] gmsg)
{
for (int i = 0; i < gmsg.Length - g.Length+1; i++)
{
if(gmsg[i]==0)
continue;
for (int j = 0; j < g.Length; j++)
{
if (gmsg[i + j] == g[j])
gmsg[i + j] = 0;
else
gmsg[i + j] = 1;
}
}
for (int i = 0; i < gmsg.Length; i++)
{
if (gmsg[i] == 1)
f = false;
}
return f;
}

}
}

⑺ 常用数据校验方法有哪些

奇偶校验”。内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、 1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数,那么在校验位定义为1,反之为0。当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。

MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc 发明,由 MD2/MD3/MD4 发展而来的。MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被“篡改”。举个例子,天天安全网提供下载的MD5校验值软件WinMD5.zip,其MD5值是,但你下载该软件后计算MD5 发现其值却是,那说明该ZIP已经被他人修改过,那还用不用该软件那你可自己琢磨着看啦。

MD5广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,来验证该用户的合法性。

MD5校验值软件WinMD5.zip汉化版,使用极其简单,运行该软件后,把需要计算MD5值的文件用鼠标拖到正在处理的框里边,下面将直接显示其MD5值以及所测试的文件名称,可以保留多个文件测试的MD5值,选定所需要复制的MD5值,用CTRL+C就可以复制到其它地方了。
参考资料:http://..com/question/3933661.html

CRC算法原理及C语言实现 -来自(我爱单片机)

摘 要 本文从理论上推导出CRC算法实现原理,给出三种分别适应不同计算机或微控制器硬件环境的C语言程序。读者更能根据本算法原理,用不同的语言编写出独特风格更加实用的CRC计算程序。
关键词 CRC 算法 C语言
1 引言
循环冗余码CRC检验技术广泛应用于测控及通信领域。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题。
这里将提供三种算法,它们稍有不同,一种适用于程序空间十分苛刻但CRC计算速度要求不高的微控制器系统,另一种适用于程序空间较大且CRC计算速度要求较高的计算机或微控制器系统,最后一种是适用于程序空间不太大,且CRC计算速度又不可以太慢的微控制器系统。
2 CRC简介
CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以 )后,再除以一个多项式,最后所得到的余数既是CRC码,如式(2-1)式所示,其中B(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
(2-1)
求CRC 码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码。本文不讨论32位的CRC算法,有兴趣的朋友可以根据本文的思路自己去推导计算方法。
CRC-16:(美国二进制同步系统中采用)
CRC-CCITT:(由欧洲CCITT推荐)
CRC-32:

接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。

3 按位计算CRC
对于一个二进制序列数可以表示为式(3-1):
(3-1)
求此二进制序列数的CRC码时,先乘以 后(既左移16位),再除以多项式G(X),所得的余数既是所要求的CRC码。如式(3-2)所示:
(3-2)
可以设: (3-3)
其中 为整数, 为16位二进制余数。将式(3-3)代入式(3-2)得:

(3-4)
再设: (3-5)
其中 为整数, 为16位二进制余数,将式(3-5)代入式(3-4),如上类推,最后得到:
(3-6)
根据CRC的定义,很显然,十六位二进制数 既是我们要求的CRC码。
式(3 -5)是编程计算CRC的关键,它说明计算本位后的CRC码等于上一位CRC码乘以2后除以多项式,所得的余数再加上本位值除以多项式所得的余数。由此不难理解下面求CRC码的C语言程序。*ptr指向发送缓冲区的首字节,len是要发送的总字节数,0x1021与多项式有关。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC乘以2再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}
[code]
按位计算CRC虽然代码简单,所占用的内存比较少,但其最大的缺点就是一位一位地计算会占用很多的处理器处理时间,尤其在高速通讯的场合,这个缺点更是不可容忍。因此下面再介绍一种按字节查表快速计算CRC的方法。
4 按字节计算CRC
不难理解,对于一个二进制序列数可以按字节表示为式(4-1),其中 为一个字节(共8位)。
(4-1)
求此二进制序列数的CRC码时,先乘以 后(既左移16位),再除以多项式G(X),所得的余数既是所要求的CRC码。如式(4-2)所示:
(4-2)
可以设: (4-3)
其中 为整数, 为16位二进制余数。将式(4-3)代入式(4-2)得:
(4-4)
因为:
(4-5)
其中 是 的高八位, 是 的低八位。将式(4-5)代入式(4-4),经整理后得:
(4-6)
再设: (4-7)
其中 为整数, 为16位二进制余数。将式(4-7)代入式(4-6),如上类推,最后得:
(4-
很显然,十六位二进制数 既是我们要求的CRC码。
式(4 -7)是编写按字节计算CRC程序的关键,它说明计算本字节后的CRC码等于上一字节余式CRC码的低8位左移8位后,再加上上一字节CRC右移8位(也既取高8位)和本字节之和后所求得的CRC码,如果我们把8位二进制序列数的CRC全部计算出来,放如一个表里,采用查表法,可以大大提高计算速度。由此不难理解下面按字节求CRC码的C语言程序。*ptr指向发送缓冲区的首字节,len是要发送的总字节数,CRC余式表是按0x11021多项式求出的。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[256]={ /* CRC余式表 */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x 1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

crc=0;
while(len--!=0) {
da=(uchar) (crc/256); /* 以8位二进制数的形式暂存CRC的高8位 */
crc<<=8; /* 左移8位,相当于CRC的低8位乘以 */
crc^=crc_ta[da^*ptr]; /* 高8位和当前字节相加后再查表求CRC ,再加上以前的CRC */
ptr++;
}
return(crc);
}
很显然,按字节求CRC时,由于采用了查表法,大大提高了计算速度。但对于广泛运用的8位微处理器,代码空间有限,对于要求256个CRC余式表(共512字节的内存)已经显得捉襟见肘了,但CRC的计算速度又不可以太慢,因此再介绍下面一种按半字节求CRC的算法。
5 按半字节计算CRC
同样道理,对于一个二进制序列数可以按字节表示为式(5-1),其中 为半个字节(共4位)。
(5-1)
求此二进制序列数的CRC码时,先乘以 后(既左移16位),再除以多项式G(X),所得的余数既是所要求的CRC码。如式(4-2)所示:
(5-2)
可以设: (5-3)
其中 为整数, 为16位二进制余数。将式(5-3)代入式(5-2)得:
(5-4)
因为:
(5-5)
其中 是 的高4位, 是 的低12位。将式(5-5)代入式(5-4),经整理后得:
(5-6)
再设: (5-7)
其中 为整数, 为16位二进制余数。将式(5-7)代入式(5-6),如上类推,最后得:
(5-
很显然,十六位二进制数 既是我们要求的CRC码。
式(5 -7)是编写按字节计算CRC程序的关键,它说明计算本字节后的CRC码等于上一字节CRC码的低12位左移4位后,再加上上一字节余式CRC右移4位(也既取高4位)和本字节之和后所求得的CRC码,如果我们把4位二进制序列数的CRC全部计算出来,放在一个表里,采用查表法,每个字节算两次(半字节算一次),可以在速度和内存空间取得均衡。由此不难理解下面按半字节求CRC码的C语言程序。*ptr指向发送缓冲区的首字节,len是要发送的总字节数,CRC余式表是按0x11021多项式求出的。
unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
}

crc=0;
while(len--!=0) {
da=((uchar)(crc/256))/16; /* 暂存CRC的高四位 */
crc<<=4; /* CRC右移4位,相当于取CRC的低12位)*/
crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本字节的前半字节相加后查表计算CRC,
然后加上上一次CRC的余数 */
da=((uchar)(crc/256))/16; /* 暂存CRC的高4位 */
crc<<=4; /* CRC右移4位, 相当于CRC的低12位) */
crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本字节的后半字节相加后查表计算CRC,
然后再加上上一次CRC的余数 */
ptr++;
}
return(crc);
}
[code]
5 结束语
以上介绍的三种求CRC的程序,按位求法速度较慢,但占用最小的内存空间;按字节查表求CRC的方法速度较快,但占用较大的内存;按半字节查表求CRC的方法是前两者的均衡,即不会占用太多的内存,同时速度又不至于太慢,比较适合8位小内存的单片机的应用场合。以上所给的C程序可以根据各微处理器编译器的特点作相应的改变,比如把CRC余式表放到程序存储区内等。[/code]

hjzgq 回复于:2003-05-15 14:12:51
CRC32算法学习笔记以及如何用java实现 出自:csdn bootcool 2002年10月19日 23:11 CRC32算法学习笔记以及如何用java实现

CRC32算法学习笔记以及如何用java实现

一:说明

论坛上关于CRC32校验算法的详细介绍不多。前几天偶尔看到Ross N. Williams的文章,总算把CRC32算法的来龙去脉搞清楚了。本来想把原文翻译出来,但是时间参促,只好把自己的一些学习心得写出。这样大家可以更快的了解CRC32的主要思想。由于水平有限,还恳请大家指正。原文可以访问:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 。

二:基本概念及相关介绍

2.1 什么是CRC

在远距离数据通信中,为确保高效而无差错地传送数据,必须对数据进行校验即差错控制。循环冗余校验CRC(Cyclic Rendancy Check/Code)是对一个传送数据块进行校验,是一种高效的差错控制方法。

CRC校验采用多项式编码方法。多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2为模,加减时不进,错位,如同逻辑异或运算。

2.2 CRC的运算规则

CRC加法运算规则:0+0=0

0+1=1

1+0=1

1+1=0 (注意:没有进位)

CRC减法运算规则:

0-0=0

0-1=1

1-0=1

1-1=0

CRC乘法运算规则:

0*0=0

0*1=0

1*0=0

1*1=1

CRC除法运算规则:

1100001010 (注意:我们并不关心商是多少。)

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

10011,.,,....

10011,.,,....

-----,.,,....

00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

-----,....

01011....

00000....

-----....

10110...

10011...

-----...

01010..

00000..

-----..

10100.

10011.

-----.

01110

00000

-----

1110 = 余数

2.3 如何生成CRC校验码

(1) 设G(X)为W阶,在数据块末尾添加W个0,使数据块为M+ W位,则相应的多项式为XrM(X);

(2) 以2为模,用对应于G(X)的位串去除对应于XrM(X)的位串,求得余数位串;

(3) 以2为模,从对应于XrM(X)的位串中减去余数位串,结果就是为数据块生成的带足够校验信息的CRC校验码位串。

2.4 可能我们会问那如何选择G(x)

可以说选择G(x)不是一件很容易的事。一般我们都使用已经被大量的数据,时间检验过的,正确的,高效的,生成多项式。一般有以下这些:

16 bits: (16,12,5,0) [X25 standard]

(16,15,2,0) ["CRC-16"]

32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]

三: 如何用软件实现CRC算法

现在我们主要问题就是如何实现CRC校验,编码和解码。用硬件实现目前是不可能的,我们主要考虑用软件实现的方法。

以下是对作者的原文的翻译:

我们假设有一个4 bits的寄存器,通过反复的移位和进行CRC的除法,最终该寄存器中的值就是我们所要求的余数。

3 2 1 0 Bits

+---+---+---+---+

Pop <-- | | | | | <----- Augmented message(已加0扩张的原始数据)

+---+---+---+---+

1 0 1 1 1 = The Poly

(注意: The augmented message is the message followed by W zero bits.)

依据这个模型,我们得到了一个最最简单的算法:

把register中的值置0.

把原始的数据后添加r个0.

While (还有剩余没有处理的数据)

Begin

把register中的值左移一位,读入一个新的数据并置于register的0 bit的位置。

If (如果上一步的左移操作中的移出的一位是1)

register = register XOR Poly.

End

现在的register中的值就是我们要求的crc余数。

我的学习笔记:

可为什么要这样作呢?我们从下面的实例来说明:

1100001010

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

-》 10011,.,,....

10011,.,,....

-----,.,,....

-》 00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

我们知道G(x)的最高位一定是1,而商1还是商0是由被除数的最高位决定的。而我们并不关心商究竟是多少,我们关心的是余数。例如上例中的G(x)有5 位。我们可以看到每一步作除法运算所得的余数其实就是被除数的最高位后的四位于G(x)的后四位XOR而得到的。那被除数的最高位有什么用呢?我们从打记号的两个不同的余数就知道原因了。当被除数的最高位是1时,商1然后把最高位以后的四位于G(x)的后四位XOR得到余数;如果最高位是0,商0然后把被除数的最高位以后的四位于G(x)的后四位XOR得到余数,而我们发现其实这个余数就是原来被除数最高位以后的四位的值。也就是说如果最高位是0就不需要作XOR的运算了。到这我们总算知道了为什么先前要这样建立模型,而算法的原理也就清楚了。

以下是对作者的原文的翻译:

可是这样实现的算法却是非常的低效。为了加快它的速度,我们使它一次能处理大于4 bit的数据。也就是我们想要实现的32 bit的CRC校验。我们还是假设有和原来一样的一个4 "bit"的register。不过它的每一位是一个8 bit的字节。

3 2 1 0 Bytes

+----+----+----+----+

Pop <-- | | | | | <----- Augmented message

+----+----+----+----+

1<------32 bits------> (暗含了一个最高位的“1”)

根据同样的原理我们可以得到如下的算法:

While (还有剩余没有处理的数据)

Begin

检查register头字节,并取得它的值

求不同偏移处多项式的和

register左移一个字节,最右处存入新读入的一个字节

把register的值和多项式的和进行XOR运算

End

我的学习笔记:

可是为什么要这样作呢? 同样我们还是以一个简单的例子说明问题:

假设有这样的一些值:

当前register中的值: 01001101

4 bit应该被移出的值:1011

生成多项式为: 101011100

Top Register

---- --------

1011 01001101

1010 11100 + (CRC XOR)

-------------

0001 10101101

首4 bits 不为0说明没有除尽,要继续除:

0001 10101101

1 01011100 + (CRC XOR)

-------------

0000 11110001

^^^^

首4 bits 全0说明不用继续除了。

那按照算法的意思作又会有什么样的结果呢?

1010 11100

1 01011100+

-------------

1011 10111100

1011 10111100

1011 01001101+

-------------

0000 11110001

现在我们看到了这样一个事实,那就是这样作的结果和上面的结果是一致的。这也说明了算法中为什么要先把多项式的值按不同的偏移值求和,然后在和 register进行异或运算的原因了。另外我们也可以看到,每一个头字节对应一个值。比如上例中:1011,对应01001101。那么对于 32 bits 的CRC 头字节,依据我们的模型。头8 bit就该有 2^8个,即有256个值与它对应。于是我们可以预先建立一个表然后,编码时只要取出输入数据的头一个字节然后从表中查找对应的值即可。这样就可以大大提高编码的速度了。

+----+----+----+----+

+-----< | | | | | <----- Augmented message

| +----+----+----+----+

| ^

| |

| XOR

| |

| 0+----+----+----+----+

v +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

+-----> +----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

255+----+----+----+----+

以下是对作者的原文的翻译:

上面的算法可以进一步优化为:

1:register左移一个字节,从原始数据中读入一个新的字节.

2:利用刚从register移出的字节作为下标定位 table 中的一个32位的值

3:把这个值XOR到register中。

4:如果还有未处理的数据则回到第一步继续执行。

用C可以写成这样:

r=0;

while (len--)
r = ((r << | p*++) ^ t[(r >> 24) & 0xFF];

可是这一算法是针对已经用0扩展了的原始数据而言的。所以最后还要加入这样的一个循环,把W个0加入原始数据。

我的学习笔记:

注意不是在预处理时先加入W个0,而是在上面算法描述的循环后加入这样的处理。

for (i=0; i<W/4; i++)
r = (r << ^ t[(r >> 24) & 0xFF];
所以是W/4是因为若有W个0,因为我们以字节(8位)为单位的,所以是W/4个0 字节。注意不是循环w/8次
以下是对作者的原文的翻译:
1:对于尾部的w/4个0字节,事实上它们的作用只是确保所有的原始数据都已被送入register,并且被算法处理。
2:如果register中的初始值是0,那么开始的4次循环,作用只是把原始数据的头4个字节送入寄存器。(这要结合table表的生成来看)。就算 register的初始值不是0,开始的4次循环也只是把原始数据的头4个字节把它们和register的一些常量XOR,然后送入register中。

3A xor B) xor C = A xor (B xor C)

总上所述,原来的算法可以改为:

+-----<Message (non augmented)
|
v 3 2 1 0 Bytes
| +----+----+----+----+
XOR----<| | | | |
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+----->+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+

算法:

1:register左移一个字节,从原始数据中读入一个新的字节.

2:利用刚从register移出的字节和读入的新字节XOR从而产生定位下标,从table中取得相应的值。

3:把该值XOR到register中

4:如果还有未处理的数据则回到第一步继续执行。

我的学习笔记:

对这一算法我还是不太清楚,或许和XOR的性质有关,恳请大家指出为什么?

谢谢。

到这,我们对CRC32的算法原理和思想已经基本搞清了。下章,我想着重根据算法思想用java语言实现。

hjzgq 回复于:2003-05-15 14:14:51
数学算法一向都是密码加密的核心,但在一般的软路加密中,它似乎并不太为人们所关心,因为大多数时候软体加密本身实现的都是一种编程上的技巧。但近几年来随着序列号加密程序的普及,数学算法在软体加密中的比重似乎是越来越大了。

我们先来看看在网路上大行其道的序列号加密的工作原理。当用户从网路上下载某个Shareware -- 共享软体后,一般都有使用时间上的限制,当过了共享软体的试用期后,你必须到这个软体的公司去注册后方能继续使用。注册过程一般是用户把自己的私人信息(一般主要指名字)连同信用卡号码告诉给软体公司,软体公司会根据用户的信息计算出一个序列码出来,在用户得到这个序列码后,按照注册需要的步骤在软体中输入注册信息和注册码,其注册信息的合法性由软体验证通过后,软体就会取消掉本身的各种限制。这种加密实现起来比较简单,不需要额外的成本,用户购买也非常方便,在网上的软体80%都是以这种方式来保护的。

我们可以注意到软体验证序列号的合法性过程,其实就是验证用户名与序列号之间的换算关系是否正确的过程。其验证最基本的有两种,一种是按用户输入的姓名来生成注册码,再同用户输入的注册码相比较,公式表示如下:

序列号 = F(用户名称)

⑻ hash算法的有哪几种,优缺点,使用场景

Hash算法在信息安全方面的应用主要体现在以下的3个方面: 1)文件校验 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

阅读全文

与校验算法的缺点是相关的资料

热点内容
虚拟机建立用户的模板文件夹 浏览:900
无锡代码编程培训班 浏览:628
eps图形数据加密 浏览:929
没有滴滴app怎么打车 浏览:101
大数乘法java 浏览:1001
如何登录服务器看源码 浏览:526
如何做服务器端 浏览:157
注册服务器地址指什么 浏览:434
文本命令行 浏览:97
扑克牌睡眠解压 浏览:194
rc4算法流程图 浏览:160
胡萝卜解压方法 浏览:36
扫描pdf格式软件 浏览:878
程序员在银行开账户 浏览:516
android数据库下载 浏览:750
中午服务器崩溃怎么办 浏览:425
产品经理和程序员待遇 浏览:443
解忧程序员免费阅读 浏览:110
录像免压缩 浏览:509
总结所学过的简便算法 浏览:363