2014-03-12 11 views
10

Ich habe eine Tabelle in SQL Server 2008 R2, die zwei Feld (WordHash, Word) enthalten. Dieses Hash Feld in C# generiert und ich muss Hash-Code für Word Feld in SQL Server neu generieren.Warum generierte MD5 Hash in SQL Server nicht gleich sind?

Aber mein Problem ist, dass generierte MD5-Hash in SQL-Server und C# sind unterschiedlich. Ich habe unten Code gefunden, um dieses Problem zu lösen, aber ich habe immer noch das gleiche Problem.

SQL-Code:

CONVERT(NVARCHAR(32),HASHBYTES('MD5', 'some word'), 2) 

Nach diesen Codeblock auf meine Frage stellen, sah ich einige verdrahteten Ergebnis! Das ist mein Ergebnis:
Meine Suche:

SELECT 
    [WordHash], 
    convert(nvarchar(32),HASHBYTES('MD5', 'Analytics'),2) AS TestHash, 
    convert(nvarchar(32),HASHBYTES('MD5', [Word]),2) AS SqlHash 
FROM myTable 

Ergebnis:

WordHash: A768CAA988605A2846599CF7E2D0C26A 
TestHash: A768CAA988605A2846599CF7E2D0C26A 
SqlHash F4AFA5FEF805F7F5163EC6402BAF61FF 

Beachten Sie, dass die 'Analytics' einem der Datensätze in der Datenbank ist.
Warum TestHash & SqlHash sind anders, während sie aus dem gleichen Code generiert !?

+4

Wenn Sie das tun 'N'some nur statt word''' 'einige word'' werde die Ergebnisse die gleichen? –

+0

Dies ist nur eine Vermutung, aber ich vermute, dass das ''Analytics''-Literal und der' [Word] '- Wert mit unterschiedlichen Codierungen behandelt werden, die tatsächlich einen Unterschied in der Hash-Ausgabe machen können. Einer kann Unicode sein, während der andere nicht Unicode ist. – David

+0

@ScottChamberlain du hast absolut recht :). Können Sie einen Link posten, um zu verstehen, warum das passiert? –

Antwort

15

Das Problem ist NVARCHAR und VARCHAR Get Hashed zu verschiedenen Werten. Sowohl HASHBYTES('MD5', 'Analytics'), als auch [WordHash] sind Hashwerte von VARCHAR Werten, aber [Word] ist ein NVARCHAR.

select HASHBYTES('MD5', 'Analytics'), 'varchar' 
union 
select HASHBYTES('MD5', N'Analytics'), 'nvarchar' 

--outputs 
------------------------------------- -------- 
0xA768CAA988605A2846599CF7E2D0C26A varchar 
0xF4AFA5FEF805F7F5163EC6402BAF61FF nvarchar 

dies beheben Sie entweder [Word] ändern müssen VARCHAR oder neu zu berechnen [WordHash] mit NVARCHAR Werte.

Einige nützliche weiterführende Literatur: Comparing SQL Server HASHBYTES function and .Net hashing

+0

Es hat funktioniert. Danke Scott :-) – Mojtaba

+2

Ändern des Abfrage-Codes in: 'convert (nvarchar (32), HASHBYTES ('MD5', konvertieren (varchar (32), [Word])), 2) AS MyHash' und es funktioniert. – Mojtaba

+1

Sie haben unseren Tag gerettet. – SSS