HashBytes'i VarChar'a dönüştürme


127

SQL Server 2005'te bir string değerinin MD5 Hash'ini almak istiyorum. Bunu aşağıdaki komutla yapıyorum:

SELECT HashBytes('MD5', 'HelloWorld')

Ancak, bu bir VarChar değeri yerine bir VarBinary döndürür. 0x68E109F0F40CA72A15E05CC22786F8E6Bir VarChar'a dönüştürmeye çalışırsam, há ðô§*à\Â'†øæbunun yerine alırım 68E109F0F40CA72A15E05CC22786F8E6.

SQL tabanlı bir çözüm var mı?

Evet

Yanıtlar:


147

Çözümü başka yerde buldum:

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

19
fn_varbintohexstr, belgelenmiş bir işlev değildir. CONVERT (Char, @ value, 2) kullanın
Cheburek

Depoda güncelleme yapmak için bir yola ihtiyaç duyduğum için varbinary ile ısırıldım. Bu harika çalıştı! teşekkürler ...
nitefrog

Bu yöntem çok yavaştır, belgelenmemiş bir işlev kullanır ve Azure'da çalışmaz. Hiç hoş değil. Bunun yerine Dönüştür'ü kullanın!
Rocklan

4
CONVERT (), SQL 2005'te çalışmaz. SQL 2008 veya üstünü kullanıyorsanız, istediğiniz kadar CONVERT () kullanın. Ne yazık ki, tüm SQL sürümleri için çalışacak tek bir komutun farkında değilim, bu yüzden ya betiğinizde çılgın bir sürüm kontrolü yapın ya da SQL sürümlerini yükseltirseniz işlevi düzeltmeniz gereken bir yere not alın.
Carl Bussema

5
CONVERT (Char, @ value, 2) yalnızca 32 bayt çıktı verir - bunu bir sha1 hash'e yaparsanız, onu kesersiniz, uygun çıktıyı korumak için convert (char (48), @ value, 2) gerekir.
Andrew Hill

82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

4
bu SQL Azure'da çalışır. SHA1 için: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor

4
Gereksiz yere nvarchar kullanmaya gerek yoktur.
Ian Kemp

3
Soru SQL Server 2005'i belirtir ve yukarıdaki önerilerden herhangi birini (ve muhtemelen başka bir sürümü de) yaparsanız, istenenleri yapmazlar. Baytların eşdeğer olduğu karakteri elde edersiniz, baytları onaltılık dizge olarak değil, istenir. GateKiller ve Xarqron işe yarayan cevaplar veriyor.
David Knight

Bu dönüştürme stilleri hakkında nereden okuyabilirim? Bu durumda parametre olarak geçilen 2'dir . Ve C # kodunda bunun bir eşdeğeri nasıl yapılır? Hangi kodlamayı seçmeliyim?
Dmytro Zhluktenko

31

master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)Bunun yerine master.dbo.fn_varbintohexstrve ardından substringingsonucu kullanın .

Aslında dahili olarak fn_varbintohexstrarar fn_varbintohexsubstring. İlk argüman fn_varbintohexsubstringona 0xFönek olarak eklenip eklenmemesini söyler . fn_varbintohexstraramalar fn_varbintohexsubstringile 1olarak internal ilk parametre olarak verilir.

İhtiyacınız olmadığı için doğrudan 0xFarayın fn_varbintohexsubstring.


27

David Knight'ın söylediğinin aksine , bu iki alternatif MS SQL 2008'de aynı yanıtı veriyor :

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))

Bu nedenle, 2008 sürümünden başlayarak ilki daha iyi bir seçim gibi görünüyor.


Bunu yanlışlıkla yazmayın, bu biraz farklı bir cevap verir! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate

13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(Onaltılıyı dizeye dönüştürmek için 1)

bunu alt dizeye dönüştür ve dizenin başından 0x'i alt dizeye göre kaldır:

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

Baytları dizeye dönüştürdükten sonra C # 'da aldığımızla tamamen aynı


2

Aşağıdaki kodu, bir SP Değişkenine Hashing Uygulayan Depolanan Bir Prosedür içinde kullanma deneyimiyle, belgelenmemiş olmasına rağmen, bu kombinasyon örneğime göre% 100 çalışır:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)

-3

Veri türünü varbinary olarak değiştirmek benim için en iyisi gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.