Ho bisogno di generare numeri casuali univoci in Postgresql con una lunghezza fissa di 13 cifre. Ho trovato un simile thread in cui è stata utilizzata una sequenza crittografata utilizzando "pseudo_encrypt", ma il numero restituito non era con una lunghezza fissa.Genera numeri casuali univoci in Postgresql con lunghezza fissa
Allora, che cosa ho bisogno è: ottenere una sequenza casuale cifrata con una lunghezza fissa di 13 cifre in cui il valore minimo è 0.000.000,000001 millions e un valore massimo è 9999999999999.
è possibile? Se non è possibile iniziare con gli zeri in primo piano non è un grosso problema (credo), posso impostarli a livello di codice durante la lettura dal db, ma sarebbe bello se Postgresql potesse farlo da solo.
- EDIT -
Dopo aver realizzato alcune cose utili devo cambiare la questione al fine di spiegare meglio che cosa ho bisogno:
ho bisogno per generare numeri casuali unici (bigint) in PostgreSQL con una lunghezza massima fissa di 13 cifre. In realtà sto cercando di usare la funzione pseudo_encrypt (64 bit), ma il numero restituito ovviamente non è con una lunghezza massima fissa di 13, nel caso a 32 bit la lunghezza massima è 10 cifre (int), e per il 64 bit è 19 (bigint).
Quindi, come ottenere una sequenza casuale crittografata con una lunghezza massima fissa di 13 cifre, dove il valore minimo è 1 e il valore massimo è 9999999999999?
È possibile modificare la funzione pseudo_ecrypt a 64 bit per ottenere questo risultato? O se non è possibile, ci sono altri metodi per ottenere una sequenza unica con questi requisiti?
funzione pseudocasuale Encrypt (64 bit)
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 bigint;
l2 bigint;
r1 bigint;
r2 bigint;
i int:=0;
BEGIN
l1:= (VALUE >> 32) & 4294967295::bigint;
r1:= VALUE & 4294967295;
WHILE i < 3 LOOP
l2 := r1;
r2 := l1 # ((((1366.0 * r1 + 150889) % 714025)/714025.0) * 32767*32767)::int;
l1 := l2;
r1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::bigint << 32) + r1);
END;
$$ LANGUAGE plpgsql strict immutable;
È possibile formattare il valore restituito da tale funzione per avere una lunghezza fissa: 'to_char (pseudo_encrypt (nextval ('seq') :: int), '0000000000000')' –
E la sequenza? Come devo impostarlo? – MattC
Lo stesso della domanda a cui ti sei collegato. Assicurati solo di avere un valore massimo che non superi le 13 cifre. –