gpt4 book ai didi

sql - 用随机数替换序列

转载 作者:行者123 更新时间:2023-11-29 11:13:41 34 4
gpt4 key购买 nike

我想用我自己定制的 id 生成器替换我在 postgresql 数据库中用于 id 的一些序列。生成器将生成一个随机数,末尾有一个校验位。所以这个:

SELECT nextval('customers')

会被这样的东西代替:

SELECT get_new_rand_id('customer')

然后该函数将返回一个数值,例如:[1-9][0-9]{9},其中最后一位数字是校验和。

我担心的是:

  1. 如何使事情成为原子的
  2. 我如何避免返回相同的 id 两次(这会通过尝试将它插入到具有唯一约束的列中而被捕获,但我认为它已经晚了)
  3. 这是个好主意吗?

注意1:我不想用uuid,因为要和客户交流,10位的uuid比36位的uuid好用多了。

注意 2:该函数很少用 SELECT get_new_rand_id() 调用,但会被分配为 id 列的默认值而不是 nextval()

编辑:好的,下面是很好的讨论!以下是对原因的一些解释:

  1. 那么,为什么我要把事情弄得过于复杂呢?目的是对客户隐藏主键。

    I give each new customer a unique customerId (generated serial number in the db). Since I communicate that number with the customer it is a fairly simple task for my competitors to monitor my business (there are other numbers such as invoice nr and order nr that have the same properties). It is this monitoring I would like to make a little bit harder (note: not impossible but harder).

  2. 为什么要校验位?

    Before there was any talk of hiding the serial nr I added a checkdigit to ordernr since there were klumbsy fingers at some points in the production, and my thought was that this would be a good practice to keep in the future.

阅读讨论后,我当然可以看出我的方法不是解决问题的最佳方法,但我对如何解决它没有其他好主意,所以请在这里帮助我。

  1. 我是否应该添加一个额外的列来放置我向客户公开的 ID,并将序列作为主键?
  2. 我怎样才能生成 id 以一种理智有效的方式公开?
  3. 是否需要校验位?

最佳答案

要从序列中生成唯一且外观随机的标识符,使用密码可能是个好主意。由于它们的输出是双射的(输入值和输出值之间存在一对一的映射)——与哈希不同,您将没有任何冲突。这意味着您的标识符不必与哈希一样长。

大多数加密密码都适用于 64 位或更大的 block ,但 PostgreSQL wiki 有一个 example PL/pgSQL procedure for a "non-cryptographic" cipher适用于(32 位)int 类型的函数。免责声明:我自己没有尝试使用此功能。

要将它用于您的主键,请从 wiki 页面运行 CREATE FUNCTION 调用,然后在您的 表上执行:

ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);

瞧!

pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> select * from foo;
foo_id
------------
1241588087
1500453386
1755259484
(4 rows)

关于sql - 用随机数替换序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687307/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com