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