Ubah HashBytes menjadi VarChar

127

Saya ingin mendapatkan MD5 Hash dari nilai string di SQL Server 2005. Saya melakukan ini dengan perintah berikut:

SELECT HashBytes('MD5', 'HelloWorld')

Namun, ini mengembalikan VarBinary bukannya nilai VarChar. Jika saya mencoba untuk mengubahnya 0x68E109F0F40CA72A15E05CC22786F8E6menjadi VarChar, saya há ðô§*à\Â'†øæmalah mendapatkannya 68E109F0F40CA72A15E05CC22786F8E6.

Apakah ada solusi berbasis SQL?

Iya

GateKiller
sumber

Jawaban:

147

Saya telah menemukan solusi lain di mana:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
GateKiller
sumber
19
fn_varbintohexstr bukan fungsi yang didokumentasikan. Gunakan CONVERT (Char, @ value, 2)
Cheburek
Saya baru saja mendapat sedikit oleh varbinary karena membutuhkan cara untuk memperbarui ke dalam gudang. Ini bekerja seperti pesona! terima kasih ...
nitefrog
Metode ini sangat lambat, menggunakan fungsi tidak berdokumen dan tidak berfungsi di Azure. Tidak keren. Gunakan Konversi sebagai gantinya!
Rocklan
4
CONVERT () tidak berfungsi di SQL 2005. Jika Anda menggunakan SQL 2008 atau di atasnya, gunakan CONVERT () semua yang Anda inginkan. Sayangnya saya tidak mengetahui satu perintah yang akan bekerja untuk semua versi SQL, jadi lakukan beberapa versi gila memeriksa skrip Anda, atau hanya membuat catatan di suatu tempat bahwa Anda perlu memperbaiki fungsi jika Anda meningkatkan versi SQL.
Carl Bussema
5
CONVERT (Char, @ value, 2) hanya menghasilkan 32 byte - jika Anda melakukan ini ke hash sha1 Anda akan memotongnya, Anda perlu mengkonversi (char (48), @ value, 2) untuk menjaga output yang sesuai.
Andrew Hill
82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Pengecoh
sumber
4
ini bekerja di SQL Azure. untuk SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor
4
Tidak perlu menggunakan nvarchar jika tidak perlu.
Ian Kemp
3
Pertanyaannya menyatakan SQL Server 2005 dan jika Anda melakukan salah satu dari saran di atas (dan mungkin juga versi lain), mereka tidak melakukan apa yang diminta. Anda mendapatkan karakter apa pun yang setara dengan byte, bukan byte sebagai string hex yang diminta. GateKiller dan Xarqron memberikan jawaban yang berhasil.
David Knight
Di mana saya bisa membaca tentang gaya konversi ini? 2 dalam hal ini yang dilewatkan sebagai parameter. Dan bagaimana cara membuat yang setara dari itu dalam kode C #? Pengkodean apa yang harus saya pilih?
Dmytro Zhluktenko
31

Gunakan master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)alih-alih master.dbo.fn_varbintohexstrdan kemudian substringinghasilnya.

Bahkan fn_varbintohexstrpanggilan fn_varbintohexsubstringinternal. Argumen pertama fn_varbintohexsubstringmengatakan untuk menambahkannya 0xFsebagai awalan atau tidak. fn_varbintohexstrpanggilan fn_varbintohexsubstringdengan 1sebagai argumen internaly pertama.

Karena Anda tidak perlu 0xF, hubungi fn_varbintohexsubstringlangsung.

Xaqron
sumber
27

Bertentangan dengan apa yang dikatakan David Knight , kedua alternatif ini mengembalikan respons yang sama di 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))

Jadi sepertinya yang pertama adalah pilihan yang lebih baik, mulai dari versi 2008.

Timo Riikonen
sumber
Jangan mengetik ini karena kesalahan yang memberikan jawaban yang agak berbeda! ... konversi (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate
13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 untuk mengubah heksadesimal menjadi string)

ubah ini menjadi lebih rendah dan hapus 0x dari awal string dengan mensubstring:

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

persis sama dengan apa yang kita dapatkan di C # setelah mengkonversi byte ke string

Ramans
sumber
2

Dengan pengalaman pribadi menggunakan kode berikut dalam Prosedur Tersimpan yang Hashing Variabel SP saya dapat mengkonfirmasi, meskipun tidak berdokumen, kombinasi ini berfungsi 100% sesuai contoh saya:

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

Mengubah datatype ke varbinary tampaknya bekerja paling baik untuk saya.

anopres
sumber