python - 为 url 目的生成看似随机的唯一数字

标签 python database algorithm base64 uniqueidentifier

所以我想知道 youtube 的网址。特别是视频 ID watch?v=XZmGGAbHqa0。类似的 tinyurl 服务也是如此。

我看到了 Tom 的视频 Will YouTube Ever Run Out Of Video IDs?那很有趣。但是以随机方式生成一个看似随机的数字,检查重复项看起来相当昂贵。

如果您还没有看过视频,youtube 会生成一个很大的唯一编号并对其进行 base64 编码。不确定在 youtube 中整个过程是否那么简单,但我正在尝试编写类似的东西。

我遇到了一个名为 Modular Multiplicative Inverse 的数学函数。 将其与一些扩展欧几里得算法 结合使用将从我们给定的输入中生成一个唯一的数字。逆向也是可能的,但是在不知道种子的情况下,某人将无法轻易地逆向或暴力破解。所以我们可以很容易地从数据库中的后续 id 中获取一个大的随机数。甚至可能是 base64。

但我有困惑。

正如 tom 在视频中提到的,跨多个服务器同步后续 ID 可能会导致问题和开销。但是如果我们不做后续,找到一个唯一的 id 会不会是一个繁琐而昂贵的任务?我们必须检查该 ID 在数据库中是否可用。

我应该避免将 url 与后续 ID 混合使用吗?或者用乘法逆之类的东西掩盖它是好的?

我为什么要base64呢?节省存储空间还是节省 URL 空间?我仍然需要生成一些看似随机、独特的东西,并且能够在不复制和搜索的情况下快速生成它。

是否有更好的方法来实现我正在尝试的目标?我确实检查了所有类似的问题和一些博客文章。其中是this

对不起,如果我不能解释清楚,我很困惑该问什么。

最佳答案

这就是为什么您完全绕过确保随机生成的数字的唯一性并使用伪随机排列 (PRP) 系列来转换预先协调的计数器的原因。

PRP 系列类似于 PRF 系列,因为它是一种采用 key 和明文并生成密文的密码,只是它在明文和密文之间具有一对一的映射。

这让人们可以使用类似 Twitter Snowflake 的设计,然后简单地将内部顺序标识符编码为非顺序外部标识符。

参见 Algorithm to turn numeric IDs in to short, different alphanumeric codes用于 Python 中的实现。

还有

M. Luby and C. Rackoff. How to construct pseudorandom permutations from pseudorandom functions. SIAM J. Comput., 17(2):373–386, Apr. 1988.

关于python - 为 url 目的生成看似随机的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58145054/

相关文章:

mysql - 在 INSERT 语句中执行 SELECT 语句的 SQL 是什么?

mysql - MySQL 中 SQL 脚本的默认数据库

algorithm - n 车完成谜题的快速算法

algorithm - 优化列表文字增删改查

javascript - 使用 jQuery 计算并知道显示了哪些行

python - PyQt QTableView 点击后如何知道行和列

database - 关于数据库通信安全

python - 最大客户数达到 celery

python - 使用 python requests 模块进行网页抓取时出现错误

python - 从列表创建数据框时出现内存错误