HashBytes를 VarChar로 변환


127

SQL Server 2005에서 문자열 값의 MD5 해시를 가져오고 싶습니다. 다음 명령으로이 작업을 수행합니다.

SELECT HashBytes('MD5', 'HelloWorld')

그러나 VarChar 값 대신 VarBinary를 반환합니다. 0x68E109F0F40CA72A15E05CC22786F8E6VarChar 로 변환하려고 하면 há ðô§*à\Â'†øæ대신 대신에 68E109F0F40CA72A15E05CC22786F8E6.

SQL 기반 솔루션이 있습니까?

답변:


147

다른 곳에서 해결책을 찾았습니다.

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

19
fn_varbintohexstr은 문서화 된 기능이 아닙니다. CONVERT (Char, @ value, 2) 사용
Cheburek

창고에 업데이트 할 방법이 필요하기 때문에 varbinary에 조금씩 가졌습니다. 이것은 매력처럼 작동했습니다! 고마워요
nitefrog

이 방법은 매우 느리고 문서화되지 않은 함수를 사용하며 Azure에서 작동하지 않습니다. 쿨하지 않아. 대신 변환을 사용하십시오!
Rocklan

4
SQL 2005에서는 CONVERT ()가 작동하지 않습니다. SQL 2008 이상을 사용하는 경우 CONVERT ()를 사용하십시오. 슬프게도 모든 SQL 버전에서 작동하는 단일 명령을 알지 못하므로 스크립트에서 미친 버전 검사를 수행하거나 SQL 버전을 업그레이드하는 경우 함수를 수정 해야하는 곳에 메모하십시오.
Carl Bussema

5
CONVERT (Char, @ value, 2)는 32 바이트 만 출력합니다. sha1 해시로이 작업을 수행하면 잘릴 경우 적절한 출력을 유지하려면 convert (char (48), @ value, 2)가 필요합니다.
앤드류 힐

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

4
이것은 SQL Azure에서 작동합니다. SHA1의 경우 : SELECT CONVERT (VARCHAR (40), HashBytes ( 'SHA1', 'Hello World'), 2)
랩터

4
불필요하게 nvarchar를 사용할 필요가 없습니다.
Ian Kemp

3
질문은 SQL Server 2005를 말하며 위의 제안 중 하나 (그리고 아마도 다른 버전도)를 수행하면 요청 된 것을하지 않습니다. 바이트가 아닌 16 진수 문자열이 아닌 바이트와 동등한 문자를 얻습니다. GateKiller와 Xarqron이 그 해답을 제시합니다.
David Knight

이러한 변환 스타일에 대한 정보는 어디에서 읽을 수 있습니까? 이 경우 매개 변수로 전달되는 2 입니다. 그리고 C # 코드에서 이에 상응하는 방법은 무엇입니까? 어떤 인코딩을 선택해야합니까?
Dmytro Zhluktenko

31

master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)대신에 결과 master.dbo.fn_varbintohexstr를 사용하십시오 substringing.

실제로 내부적으로 fn_varbintohexstr전화합니다 fn_varbintohexsubstring. 첫 번째 인수 는 접두사 fn_varbintohexsubstring로 추가할지 여부를 알려줍니다 0xF. fn_varbintohexstr전화 fn_varbintohexsubstring1internaly 첫 번째 인수로.

이 필요하지 않기 때문에 직접 0xF전화하십시오 fn_varbintohexsubstring.


27

David Knight의 말과 달리이 두 대안은 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))

따라서 2008 년부터 첫 번째가 더 나은 선택 인 것 같습니다.


미묘하게 다른 대답을주는 실수로 이것을 입력하지 마십시오! ... convert (varchar, HashBytes ( 'MD5', 'Hello World')), 2)
andrew pate

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

(16 진수를 문자열로 변환하기위한 1)

이것을 하위 문자열로 낮추고 문자열의 시작 부분에서 0을 제거하여 하위 문자열로 제거하십시오.

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

바이트를 문자열로 변환 한 후 C #에서 얻는 것과 정확히 동일


2

SP 변수가있는 저장 프로 시저 내에서 다음 코드를 사용하는 개인적인 경험을 통해 문서화되지는 않았지만이 조합은 예제에 따라 100 % 작동합니다.

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

-3

데이터 유형을 varbinary로 변경하면 가장 효과적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.