Konwertuj HashBytes na VarChar

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

SELECT HashBytes('MD5', 'HelloWorld')

Zwraca jednak wartość VarBinary zamiast wartości VarChar. Jeśli spróbuję przekształcić 0x68E109F0F40CA72A15E05CC22786F8E6 w VarChar, otrzymuję há ðô§*à\Â'†øæ zamiast 68E109F0F40CA72A15E05CC22786F8E6.

Czy jest jakieś rozwiązanie oparte na SQL?

Tak.

Author: Community, 2008-08-05

7 answers

Znalazłem rozwiązanie gdzie:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
 135
Author: GateKiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 14:26:41
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
 63
Author: Rapscallion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 16:01:17

Użyj master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0) zamiast master.dbo.fn_varbintohexstr, a następnie substringing wynik.

W rzeczywistości fn_varbintohexstr wywołuje fn_varbintohexsubstring wewnętrznie. Pierwszy argument fn_varbintohexsubstring mówi, aby dodać 0xF jako przedrostek lub nie. fn_varbintohexstr wywołuje fn_varbintohexsubstring z 1 jako pierwszym argumentem wewnętrznie.

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

 29
Author: Xaqron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-17 16:00:17

Wbrew temu, 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 pierwsza jest lepszym wyborem, począwszy od wersji 2008.

 18
Author: Timo Riikonen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 do konwersji szesnastkowej na string)

Konwertuj to na lower i usuń 0x z początku łańcucha przez podłańcuch:

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

Dokładnie to samo co w C# po konwersji bajtów na string

 10
Author: Ramans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 16:00:51

Z osobistym doświadczeniem używania poniższego kodu w ramach procedury składowanej, która Zahaszowała zmienną SP, mogę potwierdzić, choć nieudokumentowana, ta kombinacja działa w 100% jak na moim przykładzie:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
 1
Author: Simon Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-24 22:54:19

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

 -3
Author: anopres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-17 21:31:15