10
votes

Convertir une chaîne binaire en Bigint dans MySQL?

Je tente de hasch une chaîne à une valeur de 64 bits (Bigint) dans MySQL. Je suis au courant de la fonction MD5 (), qui renvoie un hachage de 128 bits en tant que chaîne binaire. Je serais heureux de simplement prendre le fond ou les 64 premiers bits de ce résultat. Cependant, je ne peux pas comprendre comment obtenir un type de chaîne binaire à un type numérique de n'importe quel type. Tous les pointeurs?


0 commentaires

3 Réponses :


2
votes
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

2 commentaires

Joli! espérait qu'il y avait quelque chose de construit.


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



16
votes

Utilisez la fonction CONV () CODE> Pour convertir le hachage MD5 de la base 16 à la base 10 et couler code> pour le convertir en un numéro:

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


2 commentaires

Nice, c'est ce que je cherche. Je pense que je n'ai pas besoin de la fonte ou je veux me lancer à Bigint, mais la fonction CONV () était vraiment ce que j'avais manqué.


Une dernière note. J'avais alors accès à cette valeur numérique depuis longtemps en Java. Les types d'entier 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 utilisent cela comme une longue signature, vous avez besoin de la distribution et de jeter sur "Signé" fait le tour.



1
votes

Vous pouvez également utiliser la fonction CRC32 CODE> qui renvoie la valeur non signée 32 bits.

SELECT CRC32(id) from SomeTable;


0 commentaires