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?
7 answers
Znalazłem rozwiązanie gdzie:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
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)
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.
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.
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
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)
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.
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