【发布时间】:2015-06-07 00:58:38
【问题描述】:
我想使用在 StackOverflow 上多次提到的 pseudo_encrypt 函数让我的 ID 看起来更随机:https://wiki.postgresql.org/wiki/Pseudo_encrypt
我如何自定义它以只为我输出唯一的“随机”数字。我在某处读到您可以更改 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;
【问题讨论】:
标签: postgresql encryption