【问题标题】:Generating seemingly random looking unique numbers for url purposes为 url 目的生成看似随机的唯一数字
【发布时间】:2019-09-28 09:34:20
【问题描述】:

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

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

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

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

但我有一些困惑。

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

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

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

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

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

【问题讨论】:

    标签: python database algorithm base64 uniqueidentifier


    【解决方案1】:

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

    PRP 族与 PRF 族相似,因为它是一种密码,它接受密钥和明文并生成密文,只是它在明文和密文之间具有一对一的映射。

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

    请参阅Algorithm to turn numeric IDs in to short, different alphanumeric codes 以了解 Python 中的实现。

    还有

    M. Luby 和 C. Rackoff。如何从伪随机函数构造伪随机排列。 SIAM J. Comput.,17(2):373–386,1988 年 4 月。

    【讨论】:

    • 很有趣.. 我也发现了一个叫做 UUID 的东西。学习所有这些东西和你提到的东西。
    猜你喜欢
    • 2015-01-14
    • 2010-11-05
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多