2009-08-11 3 views
8

MySQL에서 문자열을 64 비트 값 (bigint)으로 해시하려고합니다. 128 비트 해시를 이진 문자열로 반환하는 MD5() 함수에 대해 알고 있습니다. 나는이 결과의 아래쪽 또는 최상위 64 비트를 가져 가면 행복 할 것입니다. 그러나 바이너리 문자열 유형에서 모든 유형의 숫자 ​​유형으로 변환하는 방법을 이해할 수는 없습니다. 어떤 포인터?MySQL에서 바이너리 문자열을 bigint로 변환 하시겠습니까?

답변

14

사용을 숫자로 변환 10 CAST을 기반으로하는 기본 16에서 MD5 해시를 변환하는 CONV() 기능 :

select cast(conv(substring(md5(id), 1, 16), 16, 10) as unsigned integer) from SomeTable; 
+1

니스, 그게 내가 원하는거야. 캐스팅이 필요하지 않거나 bigint로 캐스팅하려고하지만 conv() 함수는 실제로 내가 누락 된 것입니다. –

+2

하나의 마지막 메모. Java에서이 숫자 값을 오랫동안 액세스했습니다. 자바 정수형이 서명되고, conv()의 결과는 항상 양수이다. 즉, 어떤 경우에는 오버플로를 의미한다. 이것을 signed long으로 사용하는 사람들은 캐스트가 필요하고 'signed'로 캐스팅하는 것이 트릭입니다. –

2
CREATE FUNCTION dbo.HexStrToVarBinary(@hexstr varchar(8000)) 
RETURNS varbinary(8000) 
AS 
BEGIN 
    DECLARE @hex char(1), @i int, @place bigint, @a bigint 
    SET @i = LEN(@hexstr) 

    set @place = convert(bigint,1) 
    SET @a = convert(bigint, 0) 

    WHILE (@i > 0 AND (substring(@hexstr, @i, 1) like '[0-9A-Fa-f]')) 
    BEGIN 
     SET @hex = SUBSTRING(@hexstr, @i, 1) 
     SET @a = @a + 
    convert(bigint, CASE WHEN @hex LIKE '[0-9]' 
     THEN CAST(@hex as int) 
     ELSE CAST(ASCII(UPPER(@hex))-55 as int) end * @place) 
    set @place = @place * convert(bigint,16) 
     SET @i = @i - 1 

    END 

    RETURN convert(varbinary(8000),@a) 
END 
GO 

Source

+0

니스! –

+0

다른 방법으로 제발 : D :) : –