ascii2hex mit md5 als eingabeparameter

Hallo,

Ich hatte mal vor längerer Zeit das Problem einen Hexadezimalen Wert in eine Zahl zu verwandeln.

Damals wurde ich von akretschmar auf seine Funktion ascii2hex verwiesen.

Diese Funktion versuche ich jetzt zusammen mit einem md5 Wert einzusetzen.

Dazu habe ich 2 Änderungen machen müssen:

CREATE OR REPLACE FUNCTION "public"."ascii2hex" (varchar) RETURNS bigint AS
$body$
declare 
    _count smallint; 
    _length smallint; 
    _i smallint; 
    _ret bigint; 
    _x char; 
    _f smallint; 
    _s varchar;

begin 
    _count = 0; 
    _ret = 0; 
    _s = lower($1); 
    
    if $1 ~* '^[0-9a-f]*$' then else 
       raise exception 'wrong argument: % is not a hex', $1; 
    end if;
    
    select into _length length($1); 
    
    for _i in 0.._length-1 loop 
        _x = substring(_s,_length - _i, 1); 
        _f = ascii(_x)-48; 
        
        if _f > 9 then 
           _f = _f - 39; 
        end if; 
        
        _ret = _ret + _f * 16^_i; 
    end loop; 
    
    return _ret; 
end;
$body$
LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;

ich habe eigentlich nur als Returnwert aus int ein bigint gemacht…

wenn ich nun folgendes Statement absetze:

select ascii2hex( md5('foo') ) AS nValue

bekomme ich jedoch folgendes Ergebnis:

FEHLER:  ungültige Eingabesyntax für ganze Zahl: »4.33351806292092e+15«

Kann mir jemand weiterhelfen?

baue mail in die Schleife ein:

        if _f > 9 then
           _f = _f - 39;
        end if;
        raise notice '%', _ret;
        _ret = _ret + _f * 16^_i;

(die Zeile mit dem RAISE)

und Du wirst sehen, daß der Wert für _ret nach dem 13. Durchlauf zu groß wird.


Andreas

Ahh…

Danke ich mache jetzt einfach einen Substring ( md5(),1,12)