BINARY_CHECKSUM()中的字节表示?

时间:2011-09-22 13:39:03

标签: sql-server

根据这篇文章

  

http://decipherinfosys.wordpress.com/2007/05/18/checksum-functions-in-sql-server-2005/

他们说

  

如果元素为2,则BINARY_CHECKSUM()返回相同的值   表达式具有相同的类型和字节表示。所以,“2Volvo   导演20“和”3Volvo Director 30“将产生相同

我的问题是什么是byte representation

以及为什么

SELECT BINARY_CHECKSUM('2Volvo Director 20'  )// -1356512636
SELECT BINARY_CHECKSUM('3Volvo Director 30'  )// -1356512636

给出相同的结果?

' 2 '的字节为' 3 '的字节

1 个答案:

答案 0 :(得分:5)

我不确切地知道该文章的措辞是什么意思,但是从谷歌搜索我发现SQL Server MVP已经反向设计了完整的算法(例如here)而其他人已经注意到了算法在16个字符周期内有奇怪的问题。请注意,在该示例中,更改发生在位置1和位置17:

SELECT BINARY_CHECKSUM('2Volvo Director 20'  )-- -1356512636
SELECT BINARY_CHECKSUM('3Volvo Director 30'  )-- -1356512636
--                      12345678901234567                  

相隔16个 - 如果空格被移除以便更改发生在位置1和 16 ,则会得到不同的校验和:

SELECT BINARY_CHECKSUM('2Volvo Director20'  )-- 1257395465
SELECT BINARY_CHECKSUM('3Volvo Director30'  )-- 1257395480
--                      12345678901234567                  

互联网的共识似乎是BINARY_CHECKSUM提供的哈希函数质量较低,您应优先使用HASHBYTES