我的理解是,哈希码和校验和是类似的东西 - 它们都是计算数据块的数字值,这个数字值是相对唯一的。
也就是说,两个数据块生成相同的数字哈希/校验和的概率非常低,可以在应用程序中忽略。
那么,哈希码和校验和是同一个东西吗?还是它们之间有重要的区别?
我的理解是,哈希码和校验和是类似的东西 - 它们都是计算数据块的数字值,这个数字值是相对唯一的。
也就是说,两个数据块生成相同的数字哈希/校验和的概率非常低,可以在应用程序中忽略。
那么,哈希码和校验和是同一个东西吗?还是它们之间有重要的区别?
123 % 9 = 6
122 % 9 = 5
141 % 9 = 6
6
在不同的输入中出现了两次。哈希的目的仅是将输入值映射到输出值,独特性并不是其中的一部分。因此,在哈希的世界中,产生相同输出的两个不同输入是可以接受的。
另一方面,校验和必须区分输出,即使输入中的一个位发生变化,因为它的目的不是映射,而是检测数据损坏。因此,在校验和中,产生相同输出的两个不同输入是不可接受的。
哈希码 vs 校验和
哈希码
(Sip Hash)通常用于基于哈希表的数据结构(字典、集合、哈希映射等)[Swift dictionary, Set],其中基本操作具有恒定时间 - O(1)校验和
(MD5、SHA)用于指示数据完整性。例如,为创建数字签名
计算校验和[About]主要区别在于校验和
必须是唯一的,而哈希码
可以对应不同的对象相同。例如,在Java或Swift中,您的哈希码
受到Int
的限制。通常与equals
函数一起使用。两个不同的对象可以具有相同的哈希码
。
校验和是从数据字段中通过逻辑或运算(因此求和)生成的数字。校验和具有检测数据字段中任何位或多个位的损坏的能力,即它仅检查错误,无法纠正错误。校验和是哈希值,因为校验和的大小比原始数据小。是的,您会遇到冲突,因为校验和对数据字段中的位位置完全不敏感。
循环冗余校验(CRC)是完全不同的东西,更加复杂,并且不被称为校验和。它是多项式序列的应用,具有纠正数据字段中任意数量的单个损坏位的能力。创建CRC会产生一个比原始数据字段大的数字(不像校验和),因此包括“冗余”一词的名称以及您为纠错能力所付出的代价。因此,CRC不是哈希值,不能将其与校验和混淆或命名,因为冗余必然增加了原始数据的大小。