2014-04-07 7 views

risposta

9

Vedere la funzione pseudo_encrypt, che implementa una permutazione basata sulla tecnica Feistel network. Combinato con una sequenza postgres, questo garantisce l'unicità del risultato, così come la casualità per l'occhio umano.

Esempio:

create sequence seq maxvalue 2147483647; 

create table tablename(
id bigint default pseudo_encrypt(nextval('seq')::int), 
[other columns] 
); 

Il campo effettivo di id qui è 0...2^32-1. Questo può essere regolato, se necessario, modificando la funzione. Una variante con uno spazio di output a 64 bit può essere trovata a: pseudo_encrypt() function in plpgsql that takes bigint.


EDIT: pseudo_encrypt implementa una sola permutazione, e non accetta una chiave fornita dall'utente. Se si preferisce avere le proprie permutazioni, a seconda delle chiavi segrete, è possibile considerare skip32 (un codice a blocchi a 32 bit basato su Skipjack, con 10 byte di chiavi di larghezza).

Una funzione plpgsql (portato da Perl/C) è disponibile presso: https://wiki.postgresql.org/wiki/Skip32

Problemi correlati