2008-08-05 36 views
96

Tôi muốn để có được MD5 Hash của một giá trị chuỗi trong SQL Server 2005. Tôi làm điều này với lệnh sau:Chuyển đổi HashBytes để varchar

SELECT HashBytes('MD5', 'HelloWorld') 

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

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

Yes

Trả lời

130

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

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

Không hoạt động trong SQL Azure. – Raptor

+14

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

+0

Tôi chỉ có bit bằng varbinary khi cần một cách để cập nhật vào kho. Điều này làm việc như một say mê! nhờ ... – nitefrog

-3

Thay đổi datatype để varbinary dường như làm việc tốt nhất cho tôi.

53
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2) 
+4

hoạt động trong SQL Azure. cho SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2) – Raptor

+2

Không cần sử dụng nvarchar một cách không cần thiết. –

+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 trong đó (và có thể là bất kỳ phiên bản nào khác) thì họ không làm những gì được yêu cầu. Bạn nhận được bất cứ ký tự nào các byte tương đương với, không phải là các byte như một chuỗi hex mà là những gì được yêu cầu. GateKiller và Xarqron đưa ra câu trả lời phù hợp. –

27

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

Thực tế, fn_varbintohexstr gọi fn_varbintohexsubstring nội bộ. Đối số đầu tiên của fn_varbintohexsubstring yêu cầu thêm 0xF làm tiền tố hay không. fn_varbintohexstr gọi fn_varbintohexsubstring với 1 làm đối số đầu tiên nội bộ.

Vì bạn không cần 0xF, hãy gọi trực tiếp fn_varbintohexsubstring.

+1

Cảm ơn, trông sạch sẽ hơn nhiều –

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

(1 để chuyển đổi hệ thập lục phân để string)

chuyển đổi này để làm giảm và loại bỏ 0x từ khi bắt đầu của 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

12

Tương phản với những gì David Knight cho biết, hai lựa chọn 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, nó trông giống như một đầu tiên là một lựa chọn tốt hơn, bắt đầu từ phiên bản 2008.

0

Với kinh nghiệm cá nhân của việc sử dụng đoạn mã sau trong vòng một Stored Procedure mà băm một Variable SP Tôi có thể khẳng định, mặc dù không có giấy tờ, 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) 
Các vấn đề liên quan