database postgresql – Orden de bytes inverso de un campo bytea postgres

Pregunta:

Actualmente estoy trabajando en una tabla que contiene hashes, almacenados en formato bytea. Sin embargo, convertir los valores hash en cadenas hexadecimales genera un orden de bytes incorrecto. Ejemplo:

SELECT encode(hash, 'hex') FROM mytable LIMIT 1;

Output: 1a6ee4de86143e81
Expected: 813e1486dee46e1a

¿Hay alguna forma de invertir el orden de los bytes para todas las entradas?

Respuesta:

Aquí hay un método para hacerlo, sin embargo , nunca haría esto. No hay nada de malo en almacenar bytes en la columna bytea una base de datos. Pero, no discutiría un poco en la base de datos, y si lo hiciera, usaría,

  • una función de lenguaje C , o
  • algún lenguaje de procedimiento elegante que no me obligaba a explotar las entradas en un conjunto de bytes.

Esto es sql-esque y debería funcionar: esto es lo que estamos haciendo,

  1. Genere un conjunto que consta de una serie de compensaciones 0 – (bytelength-1) .
  2. Asigne esos desplazamientos a bytes representados como cadenas de hexadecimales.
  3. Cadena agregarlos en orden inverso.

Aquí hay un ejemplo,

CREATE TABLE foo AS SELECT '\x813e1486dee46e1a'::bytea AS bar;

SELECT bar, string_agg(to_hex(byte), '') AS hash
FROM foo
CROSS JOIN LATERAL (
  SELECT get_byte(bar,"offset") AS byte
  FROM generate_series(0,octet_length(bar)-1) AS x("offset")
  ORDER BY "offset" DESC
) AS x
GROUP BY bar;

dos notas,

  1. Probablemente no podríamos usar el offset porque está reservado, pero entiendes el punto.
  2. Esto supone que su hash (barra en lo anterior) es ÚNICO.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım