Konwersja HashBytes do VarChar

głosy
102

Chcę uzyskać hash MD5 wartości ciągu w SQL Server 2005. I to zrobić za pomocą następującego polecenia:

SELECT HashBytes('MD5', 'HelloWorld')

Jednak ta zwraca VARBINARY zamiast wartości VarChar. Jeśli próbuję przekonwertować 0x68E109F0F40CA72A15E05CC22786F8E6na varchar mogę há ðô§*à\Â'†øæzamiast 68E109F0F40CA72A15E05CC22786F8E6.

Czy istnieje rozwiązanie oparte na SQL?

tak

Utwórz 05/08/2008 o 12:49
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
134

Znalazłem inny rozwiązanie, w którym:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Odpowiedział 05/08/2008 o 15:26
źródło użytkownik

głosy
59
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Odpowiedział 03/01/2011 o 15:26
źródło użytkownik

głosy
29

Użyj master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)zamiast master.dbo.fn_varbintohexstra następnie substringingwynik.

W rzeczywistości fn_varbintohexstrnazywa fn_varbintohexsubstringwewnętrznie. Pierwszy argument fn_varbintohexsubstringinformuje ją dodać 0xFjako przedrostek lub nie. fn_varbintohexstrzwraca fn_varbintohexsubstringsię 1jako pierwszy argument wewnętrznie.

Ponieważ nie trzeba 0xF, należy zadzwonić fn_varbintohexsubstringbezpośrednio.

Odpowiedział 17/03/2011 o 17:00
źródło użytkownik

głosy
15

Wbrew temu, co David Rycerz mówi, te dwie alternatywy zwrócić taką 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.

Odpowiedział 28/08/2014 o 06:35
źródło użytkownik

głosy
8
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 dla konwersji szesnastkową na sznurkiem)

przekonwertować to do obniżenia i usunąć 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 do łańcucha bajtów

Odpowiedział 07/09/2011 o 08:43
źródło użytkownik

głosy
1

Z osobistego doświadczenia stosując następujący kod wewnątrz procedury przechowywanej, które zakodowane Zmiennej SP Mogę potwierdzić, chociaż nieudokumentowana, to połączenie działa w 100%, jak na moim przykładzie:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Odpowiedział 24/02/2015 o 22:54
źródło użytkownik

głosy
-3

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

Odpowiedział 17/02/2010 o 22:31
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more