2009-08-11 107 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

相关问题