哈希码和校验和-有什么区别?


115

我的理解是,哈希码和校验和是类似的东西-为数据块计算的数值是相对唯一的。

即,两个数据块产生相同的数字哈希/校验和值的概率足够低,因此可以出于应用目的而忽略。

那么,对于同一件事,我们是否有两个词,或者哈希码和校验和之间是否存在重要区别?


3
总结以下答案:哈希码将输入减少到很小的数目,从而最大程度地减少了碰撞的机会。另一方面,校验和以最小化冲突机会的方式将输入减少到少量。您可以通过任意改写该描述来使一种声音与另一种声音有所不同。
Dan Stahlke

3
@DanStahlke-不,这不是下面的答案。是的,它们都将输入减少到较小的数目。但是这样做的方法有很多,如何选择要使用的算法?那取决于你的目标。总结最重要的两个答案:校验和的目标是“ 检测最常见的错误 ”。针对您的方案中“最常见”的错误,选择一种产生不同校验和的算法。如果您担心要切换一两个位,则可以选择一种算法,以确保检测到该特定错误!这是一个非常具体的权衡。
制造商史蒂夫(Steve)

1
@DanStahlke-另一方面,哈希码涵盖了广泛的可能取舍。如果我们的意思是在做一个哈希表中使用的值,我们知道,是冲突,很多很多。这是一个非常不同的权衡(不同于校验和)。我们正在努力平均减少碰撞。我们不保证任何事情。可能有一些输入仅相差一位,但产生相同的散列。如果平均而言,我们可以很好地散列散列值,那就很好了。但是对于校验和来说是不可接受的。
制造商史蒂夫(Steve)

Answers:


72

我想说一个校验和 一定是一个哈希码。但是,并非所有哈希码都可以构成良好的校验和。

校验和具有特殊目的---验证或检查数据的完整性(有些校验和可以通过允许进行纠错来超越此范围)。“好”校验和易于计算,并且可以检测多种类型的数据损坏(例如,一个,两个,三个错误位)。

哈希码仅描述了将数据映射到某个值的数学函数。当用作在数据结构(例如哈希表)中建立索引的手段时,低碰撞概率是合乎需要的。


6
也许一个可以用作另一个,但是考虑到它们具有不同的设计目标,这只会使问题感到困惑。
Wim Coenen

8
@gumbo:不,不是每个哈希码都是校验和。请参阅下面的MSalters中的字符串示例。
MarcH

41

他们每个人都有不同的目的:

  • 哈希码-旨在在其域内随机(以最大程度地减少哈希表等中的冲突)。密码哈希码还被设计为在计算上不可逆。
  • 校验和-旨在检测数据中最常见的错误,并且通常可以快速进行计算(有效地对快速数据流进行校验和)。

实际上,相同的功能通常对这两个目的都有好处。特别是,如果您能够负担得起计算成本,则密码学上很强的哈希码是一个很好的校验和(随机错误几乎不会破坏强大的哈希函数)。


1
同样值得一提的是,非加密版本的哈希码可以在计算时间(接近CRC)和错误检测之间提供良好的折衷,无论是故意的还是仅通信错误/位腐(不能期望CRC检测到故意篡改,因为故意设计碰撞相对容易)。
令人惊讶的2015年

1
对我来说,您答案中的关键词是校验和旨在检测最常见的错误。对,就是那样。它是一种哈希算法,已被选择为可能的数据损坏产生不同的值。这是一个特定的目的,并导致特定的算法,该算法为此进行了优化-取决于所关注的扰动类型。
制造商

22

确实存在一些差异:

  • 当输入不同时(尽可能多),校验和仅需要不同即可,但是它们的快速计算几乎同样重要。
  • 哈希码(用于哈希表)具有相同的要求,此外,它们应在代码空间中均匀分布,尤其是对于相似的输入。
  • 密码散列有很多更严格的要求,即给定一个哈希,你不能构造产生这个哈希的输入。计算时间紧随其后,根据应用的不同,可能甚至希望散列的计算速度非常慢(以抵抗暴力攻击)。

1
我认为不同输入的校验和不同不会带来任何好处。它们仅用于检查完整性,而不用于哈希。
user541686

1
@Mehrdad:那么您如何建议检查完整性,而对于不同的输入却不会得到不同的结果?
Michael Borgwardt

嗯,也许我说错了我的意思?我指的是您所说的“尽可能”的部分-我只是说没有理由让它们像哈希一样不可预测或“远”。只要输入发生典型变化,只要校验和中有一些变化,它就是很好的校验和。与散列相反,散列还具有将事物尽可能均匀/随机/不可预测/“远地”分布到其共域上的目标。
user541686

我认为您只是在“尽可能”上误解了我的意思-我的意思是,碰撞应该尽可能少,尽管这是不可避免的。我将更改措辞。
Michael Borgwardt's

@Mehrdad-起初这对我来说毫无意义。如果校验和在可能的校验和值上没有很好的分布,则意味着对于更多的输入值(与其他校验和相比),将返回一些校验和值。但是,这会减少校验和的用处吗?[这增加了被干扰的数据返回相同结果的几率,对吗?]嗯,我错了,您是对的:校验和仅必须善于检测可能的干扰。可能不需要在所有值上均匀分布。
制造商史蒂夫(Steve)

10

哈希码和校验和都用于从数据项创建短数值。区别在于,即使对数据项进行了少量修改,校验和值也应该更改。对于哈希值,仅要求现实世界的数据项应具有不同的哈希值。

一个明显的例子是字符串。字符串的校验和应包含每一位,并且顺序很重要。另一方面,哈希码通常可以实现为有限长度前缀的校验和。那将意味着“ aaaaaaaaaaaaba”将与“ aaaaaaaaaaaaab”进行相同的哈希处理,但是哈希算法可以处理此类冲突。


这个答案为我敲响了警钟。因此,数据完整性不是哈希的重点。
6

9

维基百科说得很好:

校验和函数与哈希函数,指纹,随机函数和密码哈希函数有关。但是,每个概念都有不同的应用程序,因此设计目标也不同。校验位和奇偶校验位是校验和的特殊情况,适用于小的数据块(例如,社会安全号码,银行帐号,计算机字,单个字节等)。一些纠错码基于特殊的校验和,不仅可以检测到常见错误,还可以在某些情况下恢复原始数据。


28
看完之后,我仍然想知道有什么区别。
kirk.burleson

@ kirk.burleson-我会说它们是相同的原理,但实际上总是要权衡取舍。在不同的情况下,需要权衡取舍,因此使用了不同的方法。存在两个不同的词并不是什么道理,只是说,如果您搜索校验和的良好技术,则可能会找到与搜索哈希码时不同的算法集。
制造商史蒂夫(Steve)

5

校验和可防止意外更改。

加密散列可以防止主动攻击者。

当您在网上发送位时,可能会偶然发生某些位被翻转,删除或插入的情况。为了使接收方能够检测(或有时纠正)此类事故,发送方使用校验和。

但是,如果您假设有人主动地,智能地修改了网络上的消息,并且想要防止这种攻击,请使用加密哈希(我忽略了对哈希进行加密签名,或者使用了辅助通道等,因为这个问题似乎并不难解决)。


3
“密码哈希”增加了“哈希”和“校验和”之间的混淆。“加密校验和”更好,因为它不是。
MarcH

5

尽管哈希和校验和的相似之处在于它们都基于文件的内容创建值,但是哈希与创建校验和并不相同。校验和旨在验证(检查)数据的完整性并识别数据传输错误,而散列则旨在创建数据的唯一数字指纹。

来源:CompTIA®Security +网络安全基础指南-第五版-Mark Ciampa-第191页


4

如今,它们是可互换的,但是在过去的日子里,校验和是一种非常简单的技术,您可以将所有数据加起来(通常以字节为单位),并在该值的末尾添加一个字节。.那么您希望知道是否有任何原始数据已损坏。类似于校验位,但具有字节。


4

哈希码和校验和函数之间的区别在于,它们是为不同的目的而设计的。

  • 校验和是用来发现,如果一些输入已经改变。

  • 散列码是用来发现,如果东西在输入切换,并有个别哈希码值可能太大的“距离”。

    同样,可能有对散列函数的进一步要求,与该规则相反,例如能够早期形成散列码值的树/簇/桶的能力。

    并且,如果您添加了一些共享的初始随机化功能,那么您就会了解现代加密/密钥交换的概念。


关于概率:

例如,假设输入数据实际上始终在更改(100%的时间)。并假设您具有一个“完美的”哈希/校验和函数,该函数生成一个1位的哈希/校验和值。因此,对于随机输入数据,您将在50%的时间内获得不同的哈希/校验和值。

  • 如果随机输入数据中的恰好1位已更改,则无论输入数据有多大,您都可以100%地检测到。

  • 如果随机输入数据中的2位已更改,则检测到“更改”的可能性除以2,因为这两个更改可能彼此抵消,并且没有哈希/校验和函数会检测到输入数据中的2位实际上是不同的。

    ...

这意味着,如果输入数据中的位数比哈希/校验和值中的位数大数倍,则针对不同的输入值,实际获得不同哈希/校验和值的概率会降低,而不是不变的


2

在引用为文件或数据段创建的代码(数字或其他方式)时,我倾向于使用校验和一词,该代码可用于检查文件或数据是否未损坏。我遇到的最常见用法是检查通过网络发送的文件是否未被更改(故意或其他方式)。


1
因为校验和并不难以逆转,所以这表明它们对检查是否有意更改没有任何帮助。
benblasdell

0

在Redis集群数据分片中,它使用a hash slot来确定它去哪一个节点。以下面的模运算为例:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

6跨越不同的输入两次出现。哈希的目的仅仅是将输入值映射到输出值,唯一性不是交易的一部分。因此,在哈希世界中,可以产生相同输出的两个不同输入很好。

另一方面,即使输入中的一位发生变化,校验和也必须使输出有所不同,因为它的目的不是映射,而是检测数据损坏。因此,产生相同输出的两个不同输入在校验和中是不可接受的。


-4

校验和只是通过oring(通过逻辑加法运算,因此求和)从数据字段生成的数字。校验和具有检测生成数据字段的数据字段中任何位或位数的损坏的能力,即,它检查所有错误,无法对其进行更正。校验和是散列,因为校验和的大小小于原始数据。是的,您将发生冲突,因为校验和对数据字段中的位位置完全不敏感。

循环冗余校验(CRC)完全不同,更复杂,不称为校验和。它是多项式级数的应用,它具有校正从中生成它的数据字段中任意选定数量的单个损坏位的能力。CRC的创建将导致其大小比原始数据字段大得多(与校验和不同),因此,名称包括单词“ redundancy”(冗余)以及您为纠错功能所付出的代价。因此,CRC不是哈希,也不能混淆或命名为校验和,因为冗余必定会增加原始数据的大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.