具有不同字符串的校验和返回相同的输出

问题描述 投票:3回答:2

任何人都可以解释为什么这个语句返回相同的输出?

SELECT CHECKSUM('2019-03-14 00:15:32')
SELECT CHECKSUM('2019-03-13 00:15:42') 

输出:

843611027
sql sql-server
2个回答
3
投票

来自documentation

如果表达式列表中的至少一个值发生更改,则列表校验和可能会更改。但是,这不能保证。因此,为了检测值是否已更改,我们建议仅在应用程序可以容忍偶尔错过更改时才使用CHECKSUM。否则,请考虑使用HASHBYTES。使用指定的MD5哈希算法,对于两个不同的输入,HASHBYTES将返回相同结果的概率比CHECKSUM低得多。

你碰到了碰撞。看看Hashbytes


3
投票

我不打算具体回答这个问题,但更常见的是校验和过程的实用性。

有一些不同的校验和算法,质量不同。最基本的校验和(如你所展示的那个)运行速度非常快,但碰撞率很高(两个不同字符串具有相同输出的可能性)。

如果您需要对低冲突率非常有信心,请使用“加密安全”校验和算法,该算法已经过数学证明具有非常低的冲突率。一个很好的例子是SHA256。

基本校验和适用于错误检测(即机器是否正确读取了信用卡号或条形码),但不是用于篡改检测(即,有人弄乱了这个重要消息)或标识(这是正确的密码)。

© www.soinside.com 2019 - 2024. All rights reserved.