2008-08-05 14 views
96

Chcę uzyskać MD5 Hash o wartości ciągu w SQL Server 2005. I to zrobić za pomocą następującego polecenia:Konwersja HashBytes do VarChar

SELECT HashBytes('MD5', 'HelloWorld') 

to jednak zwraca VARBINARY zamiast wartości VarChar. Jeśli spróbuję przekonwertować 0x68E109F0F40CA72A15E05CC22786F8E6 na VarChar, otrzymam há ðô§*à\Â'†øæ zamiast 68E109F0F40CA72A15E05CC22786F8E6.

Czy istnieje rozwiązanie oparte na języku SQL?

Yes

Odpowiedz

130

znalazłem rozwiązanie gdzie indziej:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32) 
+0

Nie działa w SQL Azure. – Raptor

+14

fn_varbintohexstr nie jest dokumentowana funkcja. Użyj CONVERT (Char, @ value, 2) – Cheburek

+0

Właśnie dostałem bit o varbinary jako wymagający sposobu na aktualizację do magazynu. To działało jak czar! dzięki ... – nitefrog

-3

Zmiana typu danych do varbinary wydaje się działać jak najlepiej dla mnie.

53
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2) 
+4

działa to w SQL Azure. dla SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ("SHA1", "Hello World"), 2) – Raptor

+2

Nie trzeba niepotrzebnie korzystać z nvarchar. –

+3

Pytanie podaje SQL Server 2005 i jeśli wykonasz jedną z powyższych sugestii (i prawdopodobnie także inne wersje), nie wykonają one żądanej czynności. Otrzymujesz dowolną postać, której bajty są odpowiednikami, a nie bajty jako ciąg szesnastkowy, o który prosisz. GateKiller i Xarqron dają odpowiedzi, które działają. –

27

Zastosowanie master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0) zamiast master.dbo.fn_varbintohexstr i substringing wynik.

Faktycznie fn_varbintohexstr dzwoni wewnętrznie fn_varbintohexsubstring. Pierwszy argument fn_varbintohexsubstring mówi, aby dodać 0xF jako przedrostek lub nie. fn_varbintohexstr dzwoni fn_varbintohexsubstring z 1 jako pierwszy argument internaly.

Ponieważ nie potrzebujesz 0xF, zadzwoń bezpośrednio pod numer fn_varbintohexsubstring.

+1

Dzięki, wygląda znacznie czystsze –

6
convert(varchar(34), HASHBYTES('MD5','Hello World'),1) 

(1 do konwersji szesnastkowe ciąg)

przekonwertować to do obniżenia i usuwania 0x od początku łańcucha przez podciąg:

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32) 

dokładnie tak samo jak to, co mamy w C# po konwersji bajtów na ciąg znaków

12

W przeciwieństwie do tego, co David Knight mówi, te dwie alternatywy zwracają tę samą odpowiedź w MS SQL 2008:

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2) 
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0)) 

Tak wygląda pierwsza z nich jest lepszym wyborem, począwszy od wersji 2008.

0

Z osobistego doświadczenia stosując następujący kod wewnątrz procedury przechowywanej, które zakodowane Zmiennej SP Mogę potwierdzić, chociaż nieudokumentowane, ta kombinacja działa w 100% zgodnie z moim przykładem:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)