2009-08-11 27 views
8

Estoy intentando hacer una cadena con un valor de 64 bits (bigint) en MySQL. Conozco la función MD5(), que devuelve un hash de 128 bits como una cadena binaria. Me encantaría tomar los 64 bits inferiores o superiores de este resultado. Sin embargo, no puedo descifrar cómo pasar de un tipo de cadena binaria a un tipo numérico de cualquier tipo. ¿Alguna sugerencia?¿Convertir cadena binaria a bigint en MySQL?

Respuesta

14

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; 
+1

Bien, eso es lo que estoy buscando. Creo que no necesito el elenco, o quiero lanzar a bigint, pero la función conv() era realmente lo que me estaba perdiendo. –

+2

Una última nota. Estaba accediendo a este valor numérico como largo en Java. Los tipos enteros de Java están firmados, y el resultado de conv() siempre es positivo, lo que significa que se desborda en algunos casos. Para aquellos que usan esto como un largo firmado, necesitas el yeso, y el casting para 'firmado' es el truco. –

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! esperaba que hubiera algo integrado. –

+0

Ahora al revés por favor: D: @ :) –

Cuestiones relacionadas