我的理解是,哈希码和校验和是类似的东西-为数据块计算的数值是相对唯一的。
即,两个数据块产生相同的数字哈希/校验和值的概率足够低,因此可以出于应用目的而忽略。
那么,对于同一件事,我们是否有两个词,或者哈希码和校验和之间是否存在重要区别?
我的理解是,哈希码和校验和是类似的东西-为数据块计算的数值是相对唯一的。
即,两个数据块产生相同的数字哈希/校验和值的概率足够低,因此可以出于应用目的而忽略。
那么,对于同一件事,我们是否有两个词,或者哈希码和校验和之间是否存在重要区别?
Answers:
他们每个人都有不同的目的:
实际上,相同的功能通常对这两个目的都有好处。特别是,如果您能够负担得起计算成本,则密码学上很强的哈希码是一个很好的校验和(随机错误几乎不会破坏强大的哈希函数)。
确实存在一些差异:
维基百科说得很好:
校验和函数与哈希函数,指纹,随机函数和密码哈希函数有关。但是,每个概念都有不同的应用程序,因此设计目标也不同。校验位和奇偶校验位是校验和的特殊情况,适用于小的数据块(例如,社会安全号码,银行帐号,计算机字,单个字节等)。一些纠错码基于特殊的校验和,不仅可以检测到常见错误,还可以在某些情况下恢复原始数据。
哈希码和校验和函数之间的区别在于,它们是为不同的目的而设计的。
校验和是用来发现,如果一些输入已经改变。
散列码是用来发现,如果东西在输入切换,并有个别哈希码值可能太大的“距离”。
同样,可能有对散列函数的进一步要求,与该规则相反,例如能够早期形成散列码值的树/簇/桶的能力。
并且,如果您添加了一些共享的初始随机化功能,那么您就会了解现代加密/密钥交换的概念。
关于概率:
例如,假设输入数据实际上始终在更改(100%的时间)。并假设您具有一个“完美的”哈希/校验和函数,该函数生成一个1位的哈希/校验和值。因此,对于随机输入数据,您将在50%的时间内获得不同的哈希/校验和值。
如果随机输入数据中的恰好1位已更改,则无论输入数据有多大,您都可以100%地检测到。
如果随机输入数据中的2位已更改,则检测到“更改”的可能性除以2,因为这两个更改可能彼此抵消,并且没有哈希/校验和函数会检测到输入数据中的2位实际上是不同的。
...
这意味着,如果输入数据中的位数比哈希/校验和值中的位数大数倍,则针对不同的输入值,实际获得不同哈希/校验和值的概率会降低,而不是不变的。
在引用为文件或数据段创建的代码(数字或其他方式)时,我倾向于使用校验和一词,该代码可用于检查文件或数据是否未损坏。我遇到的最常见用法是检查通过网络发送的文件是否未被更改(故意或其他方式)。
校验和只是通过oring(通过逻辑加法运算,因此求和)从数据字段生成的数字。校验和具有检测生成数据字段的数据字段中任何位或位数的损坏的能力,即,它检查所有错误,无法对其进行更正。校验和是散列,因为校验和的大小小于原始数据。是的,您将发生冲突,因为校验和对数据字段中的位位置完全不敏感。
循环冗余校验(CRC)完全不同,更复杂,不称为校验和。它是多项式级数的应用,它具有校正从中生成它的数据字段中任意选定数量的单个损坏位的能力。CRC的创建将导致其大小比原始数据字段大得多(与校验和不同),因此,名称包括单词“ redundancy”(冗余)以及您为纠错功能所付出的代价。因此,CRC不是哈希,也不能混淆或命名为校验和,因为冗余必定会增加原始数据的大小。