Chuyển đổi HashBytes sang VarChar


127

Tôi muốn lấy MD5 Hash của một giá trị chuỗi trong SQL Server 2005. Tôi thực hiện điều này bằng lệnh sau:

SELECT HashBytes('MD5', 'HelloWorld')

Tuy nhiên, điều này trả về một VarBinary thay vì giá trị VarChar. Nếu tôi cố gắng chuyển đổi 0x68E109F0F40CA72A15E05CC22786F8E6thành VarChar, tôi nhận được há ðô§*à\Â'†øæthay vì 68E109F0F40CA72A15E05CC22786F8E6.

Có giải pháp dựa trên SQL nào không?

Đúng

Câu trả lời:


147

Tôi đã tìm thấy giải pháp khác trong đó:

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

19
fn_varbintohexstr không phải là chức năng tài liệu. Sử dụng CONVERT (Char, @ value, 2)
Cheburek

Tôi chỉ nhận được một chút bởi varbinary là cần một cách để cập nhật vào kho. Điều này làm việc như một nét duyên dáng! cảm ơn ...
nitefrog

Phương pháp này rất chậm, sử dụng chức năng không có giấy tờ và không hoạt động trong Azure. Không mát mẻ. Sử dụng Chuyển đổi thay thế!
Rocklan

4
CONVERT () không hoạt động trong SQL 2005. Nếu bạn đang sử dụng SQL 2008 trở lên, thì hãy sử dụng CONVERT () tất cả những gì bạn muốn. Đáng buồn là tôi không biết một lệnh duy nhất sẽ hoạt động cho tất cả các phiên bản SQL, do đó, hãy thực hiện một số phiên bản điên rồ kiểm tra tập lệnh của bạn hoặc chỉ cần ghi chú ở đâu đó rằng bạn cần sửa hàm nếu bạn nâng cấp các phiên bản SQL.
Carl Bussema

5
CONVERT (Char, @ value, 2) chỉ xuất ra 32 byte - nếu bạn thực hiện điều này với hàm băm sha1, bạn sẽ cắt bớt nó, bạn cần convert (char (48), @ value, 2) để giữ đầu ra thích hợp.
Đồi Andrew

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

4
cái này hoạt động trong SQL Azure. cho SHA1: CHUYỂN ĐỔI CHỌN (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor

4
Không cần sử dụng nvarchar không cần thiết.
Ian Kemp

3
Câu hỏi nêu rõ SQL Server 2005 và nếu bạn thực hiện một trong các đề xuất ở trên (và có thể là bất kỳ phiên bản nào khác), họ sẽ không làm những gì được yêu cầu. Bạn nhận được bất kỳ ký tự nào các byte tương đương, không phải là byte dưới dạng chuỗi hex, đó là những gì được yêu cầu. GateKiller và Xarqron đưa ra câu trả lời hoạt động.
David Knight

Tôi có thể đọc về những kiểu chuyển đổi này ở đâu? 2 trong trường hợp này được thông qua như là tham số. Và làm thế nào để tạo một tương đương với mã C #? Tôi nên chọn mã hóa nào?
Dmytro Zhluktenko

31

Sử dụng master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)thay vì master.dbo.fn_varbintohexstrvà sau đó substringingkết quả.

Trong thực tế fn_varbintohexstrgọi fn_varbintohexsubstringnội bộ. Đối số đầu tiên fn_varbintohexsubstringbảo nó có thêm 0xFtiền tố hay không. fn_varbintohexstrcác cuộc gọi fn_varbintohexsubstringvới 1tư cách là đối số đầu tiên.

Bởi vì bạn không cần 0xF, hãy gọi fn_varbintohexsubstringtrực tiếp.


27

Trái ngược với những gì David Knight nói, hai lựa chọn thay thế này trả về cùng một phản hồi trong 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))

Vì vậy, có vẻ như cái đầu tiên là một lựa chọn tốt hơn, bắt đầu từ phiên bản 2008.


Đừng gõ nhầm bởi câu trả lời khác biệt tinh tế! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
pate

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

(1 để chuyển đổi hệ thập lục phân thành chuỗi)

chuyển đổi này thành thấp hơn và loại bỏ 0x từ đầu chuỗi bằng chuỗi con:

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

chính xác giống như những gì chúng ta nhận được trong C # sau khi chuyển đổi byte thành chuỗi


2

Với kinh nghiệm cá nhân về việc sử dụng mã sau trong Quy trình được lưu trữ mà Hashing biến SP tôi có thể xác nhận, mặc dù không có giấy tờ, sự kết hợp này hoạt động 100% theo ví dụ của tôi:

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

-3

Thay đổi kiểu dữ liệu thành varbinary dường như hoạt động tốt nhất đối với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.