我想用pseudo_encrypt功能提到在計算器上幾次,讓我的ID看起來更隨機:https://wiki.postgresql.org/wiki/Pseudo_encrypt如何自定義Postgres僞加密函數的輸出?
我怎麼可以自定義此輸出獨特的「隨機」號碼只是我。我在某處讀到,你可以改變1366.0的常數,但我不想冒任何風險與我的ID,因爲任何潛在的ID重複會導致重大問題。
我真的不知道每個常量實際上做了什麼,所以除非得到一些指導,否則我不想亂它。有誰知道我可以安全地更改哪些常數?
這就是:
CREATE OR REPLACE FUNCTION "pseudo_encrypt"("VALUE" int) RETURNS int IMMUTABLE STRICT AS $function_pseudo_encrypt$
DECLARE
l1 int;
l2 int;
r1 int;
r2 int;
i int:=0;
BEGIN
l1:= ("VALUE" >> 16) & 65535;
r1:= "VALUE" & 65535;
WHILE i < 3 LOOP
l2 := r1;
r2 := l1 # ((((1366.0 * r1 + 150889) % 714025)/714025.0) * 32767)::int;
r1 := l2;
l1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::int << 16) + r1);
END;
$function_pseudo_encrypt$ LANGUAGE plpgsql;
爲BIGINT的
CREATE OR REPLACE FUNCTION "pseudo_encrypt"("VALUE" bigint) RETURNS bigint IMMUTABLE STRICT AS $function_pseudo_encrypt$
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)::bigint;
r1 := l2;
l1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::bigint << 32) + r1);
END;
$function_pseudo_encrypt$ LANGUAGE plpgsql;
哇,很好的迴應!因此,如果我改變讓我們說ia = 1300而不是1366它仍然可以工作,並使其稍微難以弄清楚,因爲我沒有使用公開可用示例中使用的常量? – Hawk
@霍克:是的,它會工作。 PRNG的質量會受到理論上的影響,但考慮到它的使用方式,它在功能結果中可能不太明顯。 –
@Daniel:最近編輯了你在維基上的實現。它現在似乎每次迭代交換L和R *兩次(實際上循環'l1:= l1#f(r1)',而'r1'永遠不會改變)。我錯過了什麼嗎?這個新版本對你有意義嗎? –