right postgres postgre length postgresql cryptography md5 xor md5sum

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?