【问题标题】:Convert binary string to bigint in MySQL?在 MySQL 中将二进制字符串转换为 bigint?
【发布时间】:2009-08-11 10:29:43
【问题描述】:

我试图在 MySQL 中将字符串散列为 64 位值 (bigint)。我知道 MD5() 函数,它返回一个 128 位哈希作为二进制字符串。我很乐意只取这个结果的底部或顶部 64 位。但是,我无法弄清楚如何从二进制字符串类型转换为任何类型的数字类型。有什么指点吗?

【问题讨论】:

    标签: mysql hash binary md5 bigint


    【解决方案1】:

    使用 CONV() 函数将 MD5 哈希从基数 16 转换为基数 10,并使用 CAST 将其转换为数字:

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

    【讨论】:

    • 很好,这就是我要找的。我认为我不需要强制转换,或者想强制转换为 bigint,但 conv() 函数确实是我所缺少的。
    • 最后一点。然后我在 Java 中将这个数值作为 long 访问。 Java 整数类型是有符号的,并且 conv() 的结果总是正数,这意味着它在某些情况下会溢出。对于那些使用它作为签名长的人,您确实需要演员表,并且转换为“签名”就可以了。
    【解决方案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

    【讨论】:

    • 不错!希望有内置的东西。
    • 现在请反过来 :D :@ :)
    【解决方案3】:

    您还可以使用返回 32 位无符号值的 CRC32 函数。

    SELECT CRC32(id) from SomeTable;
    

    Documentation

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多