2015-03-02 39 views
2

爲什麼校驗和()函數返回爲減?Checksum()for minus

select checksum('-') /* 0 */ 
select checksum('---') /* 0 */ 
select checksum('-+-') /* 67 */ 
select checksum('+') /* 67 */ 
+0

從msdn:[CHECKSUM](https://msdn.microsoft.com/it-it/library/ms189788.aspx)'用於構建散列索引。' – Phate01 2015-03-02 12:11:23

+0

您正在使用哪個數據庫引擎?與SQL服務器我分別得到以下內容:45,12285,12189,43 – Rubik 2015-03-02 12:49:28

+1

爲什麼這讓你感到驚訝?這是一個哈希代碼,顯然是一個糟糕的代碼。我可以給你無限多的輸入,也返回零。 – usr 2015-03-02 12:53:39

回答

0

維基百科,散列函數(http://en.wikipedia.org/wiki/Hash_function):

散列函數是可以使用的,以任意大小的數字數據映射到固定大小的數字數據的任何功能。由散列函數返回的值稱爲散列值,散列碼,散列和或簡單散列。

在這個定義下,你可以有一個函數爲任何輸入返回一個零,但它是最糟糕的可能的散列。所以,如果你問他們爲什麼沒有選擇一個更好的算法,我不確定你在問正確的人。你可能想問問微軟。我們可以通過在MSDN上發表的評論推斷出至少有人在微軟知道CHECKSUM不是理想的散列函數。在這裏,他們推薦HASHBYTES,如果你需要特別好的散列。

從MSDN,CHECKSUM(處理SQL):(https://msdn.microsoft.com/en-us/library/ms189788.aspx

CHECKSUM滿足散列函數的性質:CHECKSUM施加在表達式中的任意兩個列表返回相同的值,如果的對應元素兩個列表具有相同的類型,並且在使用equals(=)運算符進行比較時是相等的。對於這個定義,指定類型的空值被認爲是相等的。如果表達式列表中的其中一個值發生更改,則列表的CHECKSUM一般也會更改。但是,CHECKSUM不會改變的可能性很小。出於這個原因,我們不建議使用CHECKSUM來檢測值是否已更改,除非您的應用程序能夠容忍偶爾錯過更改。考慮使用HashBytes來代替。當指定MD5散列算法時,HashBytes返回兩個不同輸入的相同結果的概率遠遠低於CHECKSUM的結果。