为什么 checksum()函数返回 0 为减号?
select checksum('-') /* 0 */
select checksum('---') /* 0 */
select checksum('-+-') /* 67 */
select checksum('+') /* 67 */
答案 0 :(得分:0)
来自维基百科,哈希函数(http://en.wikipedia.org/wiki/Hash_function):
散列函数是可用于将任意大小的数字数据映射到固定大小的数字数据的任何函数。哈希函数返回的值称为哈希值,哈希码,哈希值或简单哈希值。
在这个定义下,你可以有一个为任何输入返回零的函数,但它可能是最糟糕的哈希值。所以,如果你问为什么他们没有选择更好的算法,我不确定你是在问合适的人。您可能想问问Microsoft。我们可以通过在MSDN上发表的评论来推断,至少微软的某个人知道CHECKSUM不是理想的哈希函数。在这里,如果你需要特别好的哈希值,他们会推荐使用HASHBYTES。
从MSDN,CHECKSUM(Transact-SQL):( https://msdn.microsoft.com/en-us/library/ms189788.aspx)
CHECKSUM满足散列函数的属性:如果两个列表的相应元素具有相同的类型并且在使用equals(=)运算符进行比较时相等,则应用于任何两个表达式列表的CHECKSUM将返回相同的值。对于此定义,指定类型的空值被视为比较为相等。如果表达式列表中的某个值发生更改,则列表的CHECKSUM通常也会更改。但是,CHECKSUM不会改变的可能性很小。因此,我们不建议使用CHECKSUM来检测值是否已更改,除非您的应用程序可以容忍偶尔错过更改。请考虑使用HashBytes。当指定MD5哈希算法时,HashBytes为两个不同输入返回相同结果的概率远低于CHECKSUM。