2009-08-11 7 views
8

Próbuję haszysz ciąg do 64-bitowej wartości (bigint) w MySQL. Jestem świadomy funkcji MD5(), która zwraca 128-bitowy skrót jako binarny ciąg znaków. Byłbym szczęśliwy, gdyby po prostu wziąć na dół lub na górę 64 bitów tego wyniku. Jednak nie mogę dowiedzieć się, jak uzyskać od binarnego typu ciąg do dowolnego rodzaju liczbowego. Jakieś wskazówki?Konwertuj ciąg znaków binarnych na bigint w MySQL?

Odpowiedz

14

użyć funkcji CONV() przekonwertować hash MD5 od podstawy 16 do podstawy 10 i CAST przekonwertować go na numer:

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

Fajnie, tego właśnie szukam. Myślę, że nie potrzebuję obsady lub chcę rzucić na biginta, ale funkcja conv() była naprawdę tym, czego mi brakowało. –

+2

Jedna uwaga końcowa. Wtedy uzyskiwałem dostęp do tej wartości liczbowej jako długą w Javie. Typy integer Java są podpisane, a wynik conv() jest zawsze dodatni, co oznacza, że ​​w niektórych przypadkach przepełnienie. Dla tych, którzy używają tego jako znaku długiego, potrzebujesz obsady, a rzutowanie na "podpis" działa. –

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

Nice! miałem nadzieję, że coś tu jest wbudowane. –

+0

Teraz na odwrót: D: @ :) –