任何人都可以解释为什么这个语句返回相同的输出?
SELECT CHECKSUM('2019-03-14 00:15:32')
SELECT CHECKSUM('2019-03-13 00:15:42')
输出:
843611027
如果表达式列表中的至少一个值发生更改,则列表校验和可能会更改。但是,这不能保证。因此,为了检测值是否已更改,我们建议仅在应用程序可以容忍偶尔错过更改时才使用CHECKSUM。否则,请考虑使用HASHBYTES。使用指定的MD5哈希算法,对于两个不同的输入,HASHBYTES将返回相同结果的概率比CHECKSUM低得多。
你碰到了碰撞。看看Hashbytes
。
我不打算具体回答这个问题,但更常见的是校验和过程的实用性。
有一些不同的校验和算法,质量不同。最基本的校验和(如你所展示的那个)运行速度非常快,但碰撞率很高(两个不同字符串具有相同输出的可能性)。
如果您需要对低冲突率非常有信心,请使用“加密安全”校验和算法,该算法已经过数学证明具有非常低的冲突率。一个很好的例子是SHA256。
基本校验和适用于错误检测(即机器是否正确读取了信用卡号或条形码),但不是用于篡改检测(即,有人弄乱了这个重要消息)或标识(这是正确的密码)。