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

Odpowiedzi:


147

Znalazłem rozwiązanie gdzie:

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

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)

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.


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.


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


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)

-3

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.