2009-08-11 9 views
8

Je tente de hacher une chaîne à une valeur de 64 bits (bigint) dans MySQL. Je suis conscient de la fonction MD5(), qui renvoie un hachage de 128 bits en tant que chaîne binaire. Je serais heureux de prendre les 64 derniers bits de ce résultat. Cependant, je ne peux pas comprendre comment passer d'un type de chaîne binaire à un type numérique quelconque. Des pointeurs?Convertir la chaîne binaire en bigint dans MySQL?

Répondre

14

Utilisez la fonction CONV() pour convertir le hachage MD5 de la base 16 à la base 10 et CAST pour le convertir en un certain nombre:

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

Nice, c'est ce que je cherche. Je pense que je n'ai pas besoin de la distribution, ou que je veux lancer à bigint, mais la fonction conv() était vraiment ce qui me manquait. –

+2

Une note finale. J'accédais alors à cette valeur numérique en tant que long en Java. Les types entiers Java sont signés et le résultat de conv() est toujours positif, ce qui signifie qu'il déborde dans certains cas. Pour ceux qui l'utilisent comme un long signé, vous avez besoin de la distribution, et le lancer à 'signé' fait l'affaire. –

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

de Nice! J'espérais qu'il y avait quelque chose de intégré. –

+0

Maintenant, l'inverse s'il vous plaît: D: @ :) –

Questions connexes