Pregunta

Estoy tratando de hash de una cadena a un valor de 64 bits (BIGINT) en MySQL. Soy consciente de la función MD5 (), que devuelve un hash de 128 bits como una cadena binaria. Estaría feliz de tomar sólo la parte inferior o superior de 64 bits de este resultado. Sin embargo, no puedo encontrar la manera de llegar de un tipo de cadena binaria a un tipo numérico de cualquier tipo. Cualquier punteros?

¿Fue útil?

Solución

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

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

Otros consejos

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

También es posible usar la función CRC32 que devuelve valor sin signo de 32 bits.

SELECT CRC32(id) from SomeTable;

Documentación

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top