我的理解是,哈希码和校验和是类似的东西 - 它们都是计算数据块的数字值,这个数字值是相对唯一的。
也就是说,两个数据块生成相同的数字哈希/校验和的概率非常低,可以在应用程序中忽略。
那么,哈希码和校验和是同一个东西吗?还是它们之间有重要的区别?
我的理解是,哈希码和校验和是类似的东西 - 它们都是计算数据块的数字值,这个数字值是相对唯一的。
也就是说,两个数据块生成相同的数字哈希/校验和的概率非常低,可以在应用程序中忽略。
那么,哈希码和校验和是同一个东西吗?还是它们之间有重要的区别?
它们各自有不同的用途:
在实际应用中,同样的函数通常都能胜任这两个目的。特别地,如果你能承担计算成本,那么具有密码学强度的哈希码就是一个好的校验和(一个随机错误几乎不可能破坏强哈希函数)。
确实存在一些差异:
哈希码和校验码都用于从数据项中创建短数字值。区别在于,即使对数据项进行了小修改,校验码值也应该发生改变。对于哈希值,要求仅是真实世界的数据项应具有不同的哈希值。
一个明显的例子是字符串。字符串的校验码应包括每个位,顺序很重要。另一方面,哈希码通常可以实现为长度有限的前缀的校验码。这意味着“aaaaaaaaaaba”会与“aaaaaaaaaaab”具有相同的哈希值,但哈希算法可以处理这种冲突。
维基百科很好地解释了:
校验和函数与哈希函数、指纹、随机化函数和加密哈希函数有关。但是,每个概念都具有不同的应用和因此不同的设计目标。检查位和奇偶校验位是校验和的特殊情况,适用于小块数据(例如社会保障号码、银行帐户号码、计算机字、单个字节等)。一些纠错码基于特殊的校验和,不仅可以检测常见错误,而且在某些情况下还可以恢复原始数据。
校验和可以防止意外更改。
密码哈希可以防止非常有动机的攻击者。
当您发送数据位时,可能会发生一些位被翻转、删除或插入的意外事件。为了允许接收方检测(或有时纠正)此类意外事件,发送方使用校验和。
但是,如果您假设有人在传输过程中积极且智能地修改消息,并且您想保护自己免受这种攻击者的攻击,则使用密码哈希(我忽略了对哈希进行加密签名、使用辅助渠道等内容,因为问题似乎没有涉及到这个方面)。
现在这些术语已经可以互换使用了,但在过去,校验和是一种非常简单的技术,您可以将所有数据相加(通常以字节为单位),并在最后添加一个具有该值的字节..然后您就可以知道原始数据是否已经被损坏。类似于检查位,但使用的是字节。
当我提到为文件或数据创建的代码(数字或其他)时,我倾向于使用校验和这个词,该代码可用于“检查”文件或数据是否已损坏。我遇到的最常见用法是检查通过网络发送的文件是否已被更改(故意或非故意地)。