2009-08-11 15 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でこの数値に長い時間アクセスしていました。 Javaの整数型は署名され、conv()の結果は常に正の値をとるため、場合によってはオーバーフローすることになります。これを署名付きロングとして使用する場合は、キャストが必要であり、 '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:@ :) –

関連する問題