2011-09-22 66 views
1

如果在的Unicode這樣的結果:(注意ñ校驗和函數依賴於Unicode嗎?

select CHECKSUM(N'2Volvo Director 20') ---341465450 
select CHECKSUM(N'3Volvo Director 30') ---341453853 
select CHECKSUM(N'4Volvo Director 40') ---341455363 

但如果經常:

select CHECKSUM('2Volvo Director 20') ---1757834048 
select CHECKSUM('3Volvo Director 30') ---1757834048 
select CHECKSUM('4Volvo Director 40') ---1757834048 

能否請您解釋我爲什麼在第一種情況下 - 它給了我不同的感覺,第二件事給我帶來了不一樣的感覺?

有一個關於它的頭版文章說,其中:

但是校驗和()函數計算的類型以及兩個字符串比較,如果它們相等,則僅返回相同的值。

+1

BTW:我得到'-341465450','-341453853','-341455363'爲了你最後的三他們雖然在過去的2看起來非常相似的所有不同。所以不確定整理或版本在這裏扮演什麼角色。 –

+0

也許你有unicode安裝的實例? –

+0

順便說一句:我不知道你的報價是從哪裏來的,但只有**部分是不正確的。它是非常有據可查的[多值可以散列值](http://msdn.microsoft.com/en-us/library/ms189788.aspx) –

回答

1

這似乎是整理依賴。

DECLARE @T TABLE 
(
SQL_Latin1_General_CP1255_CI_AS varchar(100) COLLATE SQL_Latin1_General_CP1255_CI_AS, 
Latin1_General_CI_AS varchar(100) COLLATE Latin1_General_CI_AS 
) 
INSERT INTO @T 
SELECT '2Volvo Director 20','2Volvo Director 20' UNION ALL 
SELECT '3Volvo Director 30','3Volvo Director 30' UNION ALL 
SELECT '4Volvo Director 40','4Volvo Director 40' UNION ALL 
SELECT '5Volvo Director 50','5Volvo Director 50' UNION ALL 
SELECT '6Volvo Director 60','6Volvo Director 60' 

SELECT 
     CHECKSUM(SQL_Latin1_General_CP1255_CI_AS) AS SQL_Latin1_General_CP1255_CI_AS, 
     CHECKSUM(Latin1_General_CI_AS) AS Latin1_General_CI_AS 
FROM @T 

返回

SQL_Latin1_General_CP1255_CI_A Latin1_General_CI_AS 
------------------------------ -------------------- 
-1757834048     -341465450 
-1757834048     -341453853 
-1757834048     -341455363 
-1757834048     -341442609 
-1757834048     -341448488 

CHECKSUMdocumented爲多個碰撞比HashBytes容易發生。我不確定爲什麼CP排序規則對這些輸入有這種行爲。

+0

非常感謝你和對不起你駕駛堅果 –

+0

@ Mid787 - 你沒有!我會試着調查爲什麼'CP'給出了這些結果。 –