Pracuję nad systemem, który generuje losowe identyfikatory takie jak w odpowiedzi # 2 here.Funkcja pseudo_encrypt() w plpgsql, która zajmuje się bigintem
Mój problem polega na tym, że wspomniana funkcja pseudo_encrypt() działa z int not bigint. Próbowałem przepisać go ponownie, ale zawsze zwraca ten sam wynik:
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 bigint;
l2 int;
r1 bigint;
r2 int;
i int:=0;
BEGIN
l1:= (VALUE >> 32) & 4294967296::bigint;
r1:= VALUE & 4294967296;
WHILE i < 3 LOOP
l2 := r1;
r2 := l1 # ((((1366.0 * r1 + 150889) % 714025)/714025.0) * 32767)::int;
l1 := l2;
r1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::bigint << 32) + r1);
END;
$$ LANGUAGE plpgsql strict immutable;
Czy ktoś może to sprawdzić?
Ah maskę bitową był głupi błąd ... Dziękuję bardzo dużo! Działa teraz idealnie! Btw: chciałem zasugerować bigint, nie int. –
@ Daniel Vérité Co muszę zmodyfikować w fuction, jeśli potrzebuję biginta o maksymalnej długości 13 cyfr? – MattC
@MattC: nie jest to banalne, możesz przesłać to jako nowe pytanie. Również przy tej technice górną granicą będzie "2^N", gdzie 'N' jest liczbą parzystą, a nie' 10^N'. –