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

Generating seemingly random looking unique numbers for url purposes

所以我想知道 youtube 的 url。特别是视频 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 space?我仍然需要生成一些看似随机、独特的东西,并且能够在不复制和搜索的情况下快速生成它。

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

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

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

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

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

有关 Python 中的实现,请参见 Algorithm to turn numeric IDs in to short, different alphanumeric codes

还有

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