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

Ric*_*ett 107 language-agnostic hash computer-science checksum

我的理解是哈希码和校验和是类似的东西 - 为数据块计算的数值,它是相对独特的.

即,产生相同数字散列/校验和值的两个数据块的概率足够低,以至于出于应用目的可以忽略它.

那么我们是否有两个单词用于相同的事情,或者哈希码和校验和之间是否存在重要差异?

Zac*_*ena 65

我会说校验和 必然是一个哈希码.但是,并非所有哈希码都能成为良好的校验和.

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

哈希码简单地描述了将数据映射到某个值的数学函数.当用作数据结构(例如哈希表)中的索引的手段时,期望低冲突概率.

  • 我宁愿说:哈希码是校验和. (10认同)
  • @gumbo:不,并非每个哈希码都是校验和.请参阅下面的MSalters中的字符串示例. (8认同)
  • 也许一个可以作为另一个使用,但考虑到它们有不同的设计目标,这只会混淆问题. (6认同)

Raf*_*ird 40

每个人背后都有不同的目的:

  • 散列码 - 设计为在其域中随机(以最小化散列表中的冲突等).加密哈希码也被设计成在计算上不可逆转.
  • 校验和 - 旨在检测数据中最常见的错误,并且通常可以快速计算(有效校验快速数据流).

在实践中,相同的功能通常对两种目的都有好处.特别是,加密强哈希码是一个很好的校验和(如果你能负担得起计算成本,那么随机错误几乎不可能破坏强哈希函数).

  • 对我而言,您的答案中的关键短语是校验和*旨在检测最常见的错误*。对,就是那样。它是一种散列算法,已被选择为*可能*的数据损坏产生不同的值。这是一个特定的目的,并导致特定的算法,为此进行优化 - 取决于人们关注的扰动类型。 (2认同)

Mic*_*rdt 21

确实存在一些差异:

  • 当输入不同(尽可能频繁)时,校验和只需要不同,但它们的计算速度几乎同样重要.
  • 散列码(用于散列表)具有相同的要求,此外它们应均匀分布在代码空间中,尤其是对于相似的输入.
  • 密码散列有很多更严格的要求,即给定一个哈希,你不能构造产生这个哈希的输入.计算时间排在第二位,并且取决于应用程序,甚至可能希望散列计算非常慢(以便对抗强力攻击).


N R*_*awa 9

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

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


Jon*_*eet 8

维基百科说得好:

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

  • 读完之后,我仍然想知道区别是什么. (28认同)

MSa*_*ers 8

哈希码和校验和都用于从数据项创建短数值.不同之处在于校验和值应该更改,即使对数据项进行了少量修改也是如此.对于散列值,要求仅仅是真实世界数据项应具有不同的散列值.

一个明显的例子是字符串.字符串的校验和应包括每个位,并且顺序很重要.另一方面,哈希码通常可以实现为有限长度前缀的校验和.这意味着"aaaaaaaaaaba"会像"aaaaaaaaaaab"一样散列,但哈希算法可以处理这种冲突.


小智 5

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

  • 校验和用于查明输入中的某些内容是否已更改。

  • 哈希码用于查明输入中的某些内容是否已更改,并在各个哈希码值之间保持尽可能大的“距离”。

    此外,与此规则相反,对哈希函数可能还有进一步的要求,例如尽早形成哈希代码值的树/簇/桶的能力。

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


关于概率:

例如,假设输入数据实际上总是发生变化(100% 的时间)。假设您有一个“完美”的哈希/校验和函数,可以生成 1 位哈希/校验和值。因此,对于随机输入数据,您将在 50% 的情况下获得不同的哈希/校验和值。

  • 如果随机输入数据中正好有 1 位发生了变化,那么无论输入数据有多大,您都能够 100% 地检测到这一变化。

  • 如果随机输入数据中的 2 位发生了更改,则检测到“更改”的概率将除以 2,因为这两种更改可能会相互抵消,并且没有哈希/校验和函数会检测到输入数据中的 2 位实际上不同。

    ...

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


use*_*863 5

校验和可防止意外更改。

加密哈希可以防止非常有动力的攻击者。

当您在线路上发送位时,可能会意外地发生某些位被翻转、删除或插入的情况。为了让接收方检测(或有时纠正)这样的事故,发送方使用校验和。

但是,如果您假设有人主动且智能地修改线路上的消息,并且您想防范此类攻击者,那么请使用加密散列(我忽略对散列进行加密签名,或使用辅助通道等,因为这个问题似乎并没有回避这一点)。

  • “加密哈希”增加了“哈希”和“校验和”之间的混淆。“加密校验和”更好,因为它没有。 (3认同)