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

时间:2019-03-20 15:32:22

标签: sql sql-server

有人可以解释为什么该语句返回相同的输出吗?

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

输出:

843611027

2 个答案:

答案 0 :(得分:3)

我将不具体回答这个问题,而是更一般地说,就校验和过程的实用性而言。

有几种不同的校验和算法,它们的质量各不相同。最基本的校验和(如您正在显示的校验和)运行起来非常快,但是冲突率很高(两个不同的字符串将具有相同的输出的可能性)。

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

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

答案 1 :(得分:3)

来自documentation

  

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

您遇到了碰撞。看看Hashbytes