Estoy tratando de hash de una cadena a un valor de 64 bits (bigint) en MySQL. Soy consciente de que el MD5() función que devuelve un hash de 128 bits como una cadena binaria. Yo estaría feliz de tomar sólo la parte inferior o superior de 64 bits de este resultado. Sin embargo, no puedo averiguar cómo conseguir a partir de una cadena binaria de tipo a un tipo numérico de cualquier tipo. Alguna sugerencia?

OriginalEl autor Sean Owen | 2009-08-11

2 Comentarios

  1. 14

    Utilizar el CONV() función para convertir el hash MD5 de la base 16 a base 10 y CAST para convertir a un número:

    select cast(conv(substring(md5(id), 1, 16), 16, 10) as unsigned integer) from SomeTable;
    Muy bonito, que es lo que estoy buscando. Creo que no necesito el molde, o quieres lanzar a bigint, pero la conv() función era realmente lo que me estaba perdiendo.
    Una nota final. Yo era entonces el acceso a este valor numérico como un tiempo en Java. En Java los tipos enteros están firmados, y el resultado de conv (a) es siempre positiva, lo que significa que se desborda en algunos casos. Para aquellos que utilizan esto como una firma de largo, usted no necesita el elenco, y el lanzamiento a la «firma» hace el truco.

    OriginalEl autor Ken Keenan

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

    Fuente

    Bueno! fue con la esperanza de que había algo construido.
    Ahora al revés, por favor 😀 :@ 🙂

    OriginalEl autor Max

Dejar respuesta

Please enter your comment!
Please enter your name here