加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL – 随机主键

发布时间:2020-12-13 16:13:19 所属栏目:百科 来源:网络整理
导读:我需要一个PostgreSQL表的主键. ID应该包含大约20个数字的数字. 我是数据库的初学者,也没有使用PostgreSQL.我找到了一些随机id的例子,但是那些带有字符的例子我只需要一个整数. 任何人都可以帮我解决这个问题吗? 我猜你实际上是指随机的20位数,因为1到20之
我需要一个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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读