2009-08-11 11 views
8

Sto tentando di eseguire l'hashing di una stringa su un valore a 64 bit (bigint) in MySQL. Sono a conoscenza della funzione MD5(), che restituisce un hash a 128 bit come stringa binaria. Sarei felice di prendere solo i 64 bit in basso o in cima a questo risultato. Tuttavia, non riesco a capire come ottenere da un tipo di stringa binaria a un tipo numerico di qualsiasi tipo. Qualche indicazione?Converti la stringa binaria in bigint in MySQL?

risposta

14

Utilizzare la funzione CONV() per convertire l'hash MD5 da base 16 a base 10 e CAST per convertirlo in un numero:

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

Bello, questo è quello che sto cercando. Penso di non aver bisogno del cast, o di voler trasmettere a bigint, ma la funzione conv() era davvero ciò che mi mancava. –

+2

Un'ultima nota. Stavo quindi accedendo a questo valore numerico come un lungo in Java. I tipi interi Java sono firmati, e il risultato di conv() è sempre positivo, il che significa che in alcuni casi trabocca. Per chi usa questo come un long firmato, hai bisogno del cast, e il casting per "firmato" fa il trucco. –

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

Nizza! Speravo che ci fosse qualcosa di costruito. –

+0

Ora il contrario per favore: D: @ :) –