在 PostgreSQL 中,如何为列生成随机的唯一整数,使其不在表列中存在?
参考pseudo_encrypt函数,它基于Feistel网络技术实现置换。与Postgres序列结合使用,可以确保结果唯一性,并对人眼呈现随机性。
示例:
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE int) returns int AS $$
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 * r1 + 150889) % 714025) / 714025.0) * 32767)::int;
l1 := l2;
r1 := r2;
i := i + 1;
END LOOP;
RETURN ((r1 << 16) + l1);
END;
$$ LANGUAGE plpgsql strict immutable;
create sequence seq maxvalue 2147483647;
create table tablename(
id int default pseudo_encrypt(nextval('seq')::int),
[other columns]
);
可以在以下网址找到输出空间为64位的变体: pseudo_encrypt() function in plpgsql that takes bigint.
编辑: pseudo_encrypt
只实现了一种置换,并且不接受用户提供的密钥。如果您想拥有自己的置换,根据秘密密钥,您可以考虑使用 skip32
(基于Skipjack的32位块密码,具有10字节宽度的密钥)。
一个从Perl/C移植而来的 plpgsql 函数可以在以下网址找到: https://wiki.postgresql.org/wiki/Skip32
创建表tablename( id int 默认伪加密(nextval('seq')::int), [其他列] );
- Amol Kshirsagar