Konwertuj HashBytes na VarChar

127

Chcę uzyskać skrót MD5 wartości ciągu w programie SQL Server 2005. Robię to za pomocą następującego polecenia:

SELECT HashBytes('MD5', 'HelloWorld')

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

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

tak

GateKiller
źródło

Odpowiedzi:

147

Znalazłem rozwiązanie gdzie:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
GateKiller
źródło
19
Funkcja fn_varbintohexstr nie jest udokumentowana. Użyj CONVERT (znak, @ wartość, 2)
Cheburek
Właśnie zostałem ugryziony przez varbinary, ponieważ potrzebuję sposobu na aktualizację do magazynu. To zadziałało jak urok! dzięki ...
nitefrog
Ta metoda jest bardzo powolna, używa nieudokumentowanej funkcji i nie działa na platformie Azure. Nie fajnie. Zamiast tego użyj Convert!
Rocklan,
4
CONVERT () nie działa w SQL 2005. Jeśli używasz SQL 2008 lub nowszego, użyj CONVERT (), ile chcesz. Niestety nie znam ani jednego polecenia, które będzie działać dla wszystkich wersji SQL, więc albo wykonaj jakieś szalone sprawdzenie wersji w swoim skrypcie, albo po prostu zanotuj gdzieś, że musisz naprawić funkcję, jeśli zaktualizujesz wersje SQL.
Carl Bussema
5
CONVERT (Char, @ value, 2) wyprowadza tylko 32 bajty - jeśli zrobisz to do skrótu sha1, skrócisz go, potrzebujesz convert (char (48), @ value, 2), aby zachować odpowiednie wyjście.
Andrew Hill
82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Bestia
źródło
4
działa to w SQL Azure. dla SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor,
4
Nie ma potrzeby niepotrzebnego używania nvarchar.
Ian Kemp
3
Pytanie dotyczy SQL Server 2005 i jeśli zastosujesz którąś z powyższych sugestii (i prawdopodobnie każdą inną wersję), nie zrobią tego, o co proszono. Otrzymujesz dowolny znak, któremu odpowiadają bajty, a nie bajty jako ciąg szesnastkowy, o który jest proszony. GateKiller i Xarqron dają odpowiedzi, które działają.
David Knight
Gdzie mogę przeczytać o tych stylach konwersji? 2 w tym przypadku, który jest przekazywany jako parametr. A jak zrobić odpowiednik tego w kodzie C #? Jakie kodowanie powinienem wybrać?
Dmytro Zhluktenko
31

Użyj master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)zamiast master.dbo.fn_varbintohexstra potemsubstringing wynik.

W rzeczywistości fn_varbintohexstrdzwoni fn_varbintohexsubstringwewnętrznie. Pierwszy argument fn_varbintohexsubstringmówi mu, aby dodać 0xFjako przedrostek, czy nie. fn_varbintohexstrzwraca fn_varbintohexsubstringsię 1jako pierwszy argument wewnętrznie.

Ponieważ nie potrzebujesz 0xF, zadzwoń fn_varbintohexsubstringbezpośrednio.

Xaqron
źródło
27

W przeciwieństwie do tego, co mówi David Knight , 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))

Wygląda więc na to, że pierwszy jest lepszym wyborem, począwszy od wersji 2008.

Timo Riikonen
źródło
Nie wpisuj tego przez pomyłkę, co daje nieco inną odpowiedź! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate
13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 do konwersji szesnastkowej na ciąg znaków)

przekonwertuj to na niższy i usuń 0x z początku ciągu przez podłańcuch:

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

dokładnie to samo, co otrzymujemy w C # po przekonwertowaniu bajtów na string

Ramans
źródło
2

Dzięki osobistemu doświadczeniu w korzystaniu z następującego kodu w ramach procedury składowanej, która zahaszowała zmienną SP, mogę potwierdzić, chociaż nieudokumentowane, ta kombinacja działa w 100%, jak na moim przykładzie:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Simon Jones
źródło
-3

Zmiana typu danych na varbinary wydaje się działać najlepiej.

anopres
źródło