gpt4 book ai didi

postgresql - 网络应用程序中随机ID的方法是什么

转载 作者:行者123 更新时间:2023-11-29 12:01:16 25 4
gpt4 key购买 nike

我有这样的 URL:

http://domain.com/object/23/

我希望 23 不是连续的,而是相当随机的。我在 Stack Overflow 上看到过很多其他帖子也问过同样的问题,但我的要求与我所看到的有所不同。

我的许多使用该网站的人都是竞争对手,他们很容易四处查看一些数字以获取竞争信息。我这样做不是为了安全,我知道通过默默无闻的安全是浪费时间。我只是在寻找一种快速的方法来防止人们四处闲逛。

我正在使用带有 Postgres 数据库的 python/SQLAlchemy 来执行此操作。我看过 UUID 的主键,但它们似乎对性能有很大影响,因为我有很多连接发生。我还可以在附加列中执行 UUID,然后根据顺序整数主键执行所有连接。

大多数需要此功能的表的记录少于 1000 条。但是一张表会有几百万条记录。如果没有那个表,我将只使用 uuid 并完成它。但既然我这样做了,我真的不认为 uuid 是一个不错的选择。

真正的问题是我还有什么其他选择。

  1. 使用顺序数字主键,但在数据库外部使用一些轻量级算法对它们进行动态加密/解密

  2. 分离列并对在创建行时生成的 primary_key + secret_key 使用 sha1 散列(或其他散列)。然后我可以通过这个散列找到行,然后在正常的 pk 上进行所有连接。

性能是这里最重要的事情,同时仍然保持一定程度的随机性和低碰撞几率。 #1 的加密/解密的最佳选择是什么,或者#2 的最佳哈希算法是什么。有没有比这两种方法更明显的方法?有几百万行 uuid 不会让我慢下来太多,这就是解决方案吗?

最佳答案

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

大多数加密密码都适用于 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)

关于postgresql - 网络应用程序中随机ID的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5480617/

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