2009-08-11 28 views
8

我正在嘗試在MySQL中將字符串散列爲64位值(bigint)。我知道MD5()函數,它返回一個128位散列作爲二進制字符串。我很樂意獲取這個結果的最低或最高64位。但是,我無法弄清楚如何從二進制字符串類型轉換爲任何類型的數字類型。任何指針?在MySQL中將二進制字符串轉換爲bigint?

回答

14

使用CONV()函數MD5哈希轉換從基地16到基地10 CAST將其轉換爲一個數字:

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

不錯,這就是我要找的。我認爲我不需要演員陣容,或者想投向bigint,但conv()函數實際上是我錯過的。 – 2009-08-11 11:26:03

+2

最後一個注意事項。然後我在Java中訪問這個數字值。 Java整數類型被簽名,並且conv()的結果總是正數,這意味着它在某些情況下會溢出。對於那些將這作爲簽名長的人來說,你確實需要演員陣容,並且投射到「簽名」才能實現。 – 2009-08-25 09:51:09

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

不錯!希望有內置的東西。 – 2009-08-11 11:24:04

+0

現在反過來請:D:@ :) – 2014-01-28 06:19:55

相關問題