我需要一个PostgreSQL表的主键。 ID应该包含大约20个数字的数字。
我是数据库的初学者,也没有使用PostgreSQL。我找到了一些随机id的例子,但是那些带有字符的例子我只需要一个整数。
有人可以帮我解决这个问题吗?
答案 0 :(得分:18)
我猜你实际上意味着随机的20位数字,因为1到20之间的随机数会快速重复并导致碰撞。
你需要的可能实际上不是一个随机数,它是一个出现随机的数字,而实际上是一个非重复的伪随机序列。否则,当发生碰撞时,您的插入会随机失败。
我刚想做类似的事情时,我问过pgsql-general列表,得到了一条非常有用的建议:在正常序列上使用feistel密码。见this useful wiki example。感谢DanielVérité的实施。
示例:
postgres=# SELECT n, pseudo_encrypt(n) FROM generate_series(1,20) n;
n | pseudo_encrypt
----+----------------
1 | 1241588087
2 | 1500453386
3 | 1755259484
4 | 2014125264
5 | 124940686
6 | 379599332
7 | 638874329
8 | 898116564
9 | 1156015917
10 | 1410740028
11 | 1669489846
12 | 1929076480
13 | 36388047
14 | 295531848
15 | 554577288
16 | 809465203
17 | 1066218948
18 | 1326999099
19 | 1579890169
20 | 1840408665
(20 rows)
这些不是20位,但您可以通过将它们相乘并截断结果来填充它们,或者您可以修改feistel密码函数以生成更大的值。
要将其用于密钥生成,只需写下:
CREATE SEQUENCE mytable_id_seq;
CREATE TABLE mytable (
id bigint primary key default pseudo_encrypt(nextval('mytable_id_seq')),
....
);
ALTER SEQUENCE mytable_id_seq OWNED BY mytable;