Potrzebuję generować unikalne liczby losowe w Postgresql o stałej długości 13 cyfr. Znalazłem podobny thread, gdzie użyto sekwencji zaszyfrowanej przy użyciu "pseudo_encrypt", ale zwrócona liczba nie miała stałej długości.Generowanie unikatowych liczb losowych w Postgresql o ustalonej długości
Więc, co jest mi potrzebne: uzyskać zaszyfrowaną losową sekwencję o stałej długości 13 cyfr, w których wartość MIN 0000000000001 i max wartości jest 9999999999999.
jest to możliwe? Jeśli start z zerami z przodu nie jest możliwy to nie jest duży problem (myślę), mogę ustawić je programowo podczas odczytu z db, ale byłoby wspaniale, gdyby Postgresql mógł zrobić to sam.
- EDIT -
Po sobie sprawę kilka przydatnych rzeczy muszę zmienić pytanie, aby lepiej wyjaśnić, co potrzebne:
muszę generować unikatowe numery losowe (bigint) w PostgreSQL z stała maksymalna długość 13 cyfr. Właściwie próbuję użyć funkcji pseudo_encrypt (64-bitowej), ale zwrócona liczba oczywiście nie ma stałej maksymalnej długości 13, w przypadku 32-bitowym maksymalna długość wynosi 10 cyfr (int), a dla 64-bitowej 19 (bigint).
Jak uzyskać zaszyfrowaną losową sekwencję o ustalonej maksymalnej długości 13 cyfr, gdzie minimalna wartość wynosi 1, a maksymalna to 9999999999999?
Czy można zmienić funkcję 64-bitowego pseudo_ecrypt, aby uzyskać ten wynik? A jeśli nie jest to możliwe, istnieją inne metody uzyskania unikalnej sekwencji z tymi wymaganiami?
funkcja pseudolosowa szyfrowanie (64-bitowe)
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;
Możesz sformatować zwróconą wartość z tej funkcji, aby mieć stałą długość: 'to_char (pseudo_encrypt (nextval ('seq') :: int), '0000000000000')' –
A co z sekwencją? Jak mam to ustawić? – MattC
To samo, co w pytaniu, z którym się łączyłeś. Upewnij się, że masz maksymalną wartość, która nie przekracza 13 cyfr. –