如何使用函数在PostgreSQL中生成随机唯一编号

Pra*_*hah 7 postgresql

在PostgreSQL中,如何为列生成随机唯一整数,返回哪些不在表列中退出?

Dan*_*ité 13

请参阅pseudo_encrypt函数,该函数实现基于Feistel网络技术的置换.结合postgres序列,这可以保证结果的独特性,以及人眼的随机性.

例:

create sequence seq maxvalue 2147483647;

create table tablename(
 id bigint default pseudo_encrypt(nextval('seq')::int),
 [other columns]
);
Run Code Online (Sandbox Code Playgroud)

这里的有效范围id0...2^32-1.如有必要,可以通过修改功能来调整.具有64位输出空间的变体可以在以下内容中找到:plpgsql中的pseudo_encrypt()函数,需要bigint.


编辑:pseudo_encrypt只实现一个排列,它不接受用户提供的密钥.如果你喜欢自己的排列,根据密钥,你可以考虑skip32(基于Skipjack的32位分组密码,10字节宽密钥).

可以在以下网址获得plpgsql函数(从Perl/C移植):https: //wiki.postgresql.org/wiki/Skip32