根据这篇文章
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 '的字节
答案 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
。