我需要一个Postgresql表的主键. ID应该包含大约20个数字的数字.
我是数据库的初学者,也没有使用Postgresql.我找到了一些随机id的例子,但是那些带有字符的例子我只需要一个整数.
任何人都可以帮我解决这个问题吗?
我猜你实际上是指随机的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;