length - Cómo XOR valores de hash md5 y echarlos a HEX en postgresql
replace en postgresql (1)
Esos valores binarios son de hecho de tipo bit varying
, que difiere significativamente de bytea
.
bit varying
viene con soporte incorporado para XOR y demás, pero PostgreSQL no proporciona un elenco de bit varying
a bytea
.
Podrías escribir una función que haga el molde, pero no es trivial y probablemente no sea la manera más eficiente en tu caso.
Tendría más sentido para XOR el md5 digiere directamente. PostgreSQL tampoco proporciona el operador XOR para bytea
, pero se puede escribir fácilmente en una función, especialmente cuando se supone que los operandos tienen la misma longitud (16 bytes en el caso de los resúmenes md5):
CREATE FUNCTION xor_digests(_in1 bytea, _in2 bytea) RETURNS bytea
AS $$
DECLARE
o int; -- offset
BEGIN
FOR o IN 0..octet_length(_in1)-1 LOOP
_in1 := set_byte(_in1, o, get_byte(_in1, o) # get_byte(_in2, o));
END LOOP;
RETURN _in1;
END;
$$ language plpgsql;
Ahora la función incorporada postgresql md5
que produce una cadena hexadecimal tampoco es la mejor opción para el postprocesamiento. El módulo pgcrypto
proporciona esta función en su lugar:
digest(data text, type text) returns bytea
Usando esta función y obteniendo el resultado final como una cadena hexagonal:
select encode(
xor_digest ( digest(''first string'', ''md5'') ,
digest(''second string'', ''md5'')),
''hex'');
produce el resultado: c1bd61a3c411bc0127c6d7ab1238c4bd
con text
tipo.
Si no se puede instalar pgcrypto
y solo está disponible la función md5
incorporada, aún puede combinar encode
y decode
para lograr el resultado de esta manera:
select
encode(
xor_digest(
decode(md5(''first string''), ''hex''),
decode(md5(''second string''), ''hex'')
),
''hex''
);
Resultado:
c1bd61a3c411bc0127c6d7ab1238c4bd
Lo que he intentado hasta ahora
SELECT md5(text) will return text (hex strings) .
Después de eso tenemos que xor ellos
SELECT x''hex_string'' # x''hex_string'';
Pero lo anterior da como resultado valores binarios. ¿Cómo los vuelvo a convertir en una cadena hexadecimal?
¿Hay de todos modos xor md5 valores en postgresql y convertir esto en valores hexadecimales de nuevo?