【问题标题】:YouTube URL algorithm?YouTube 网址算法?
【发布时间】:2011-03-03 08:49:59
【问题描述】:

您将如何生成 YouTube 使用的唯一视频 URL?

例子:

【问题讨论】:

  • 如果您拥有 Scrabble,只需摇晃袋子,选择前几个:/
  • @Peter:如果你需要超过一分钟左右,那会很乏味......
  • @Peter:不知道 Scrabble 也有数字牌 :) 也许你在谈论这个特别版本 ajmetter.com/uploads/1/0/0/8/1008287/9043661.jpg
  • 许多 coprs 使用这些序列。它们通常被编码和解码以映射到存储中的数据位置。并且如上所述通常非常简单的算法。
  • 你为什么要这个?是 (a) 使人们无法猜测 URL 还是 (b) 使 URL 均匀分布在文件系统的目录层次结构中(以解决缓慢的目录搜索)。

标签: algorithm


【解决方案1】:

您可以使用任何库或某些语言(例如 python 在标准库中提供)。

例子:

import secrets


id_length = 12
random_video_id = secrets.token_urlsafe(id_length)

【讨论】:

    【解决方案2】:

    YouTube 使用 Base64 编码为每个视频生成 ID。生成 ID 所涉及的字符由

    (A-Z) + (a-z) + (0-9) + (-) + (_)。 (64 个字符)。

    使用 Base64 编码并且最多只有 11 个字符,它们可以生成 73+ 个 Quintilian 唯一 ID。那是多大的 ID 池?

    好吧,这足以让地球上的每个人每分钟制作视频 18000 年。

    而且他们只使用 11 个字符(64*64*64*64*64*64*64*64*64*64*64)就获得了如此巨大的数字,如果他们需要更多 ID,他们只需添加 1让他们的 ID 更加个性化。

    所以当视频上传到 YouTube 时,他们基本上会从 73+ Quintilian 的可能性中随机选择,看看它是否已经被拍摄。如果不使用它,否则寻找另一个。

    详细解释请参考此video

    【讨论】:

    • 我以前看过这个视频,但我不确定“检查它是否已经被拍摄”就像听起来那么简单。如果在该服务器正在检查时它被另一台服务器选择了怎么办?等它回来的时候,不可能再这么确定了
    • @BrianLeishman,您可以控制实现集中式算法的并发,该算法为每个散列提供信号量(或锁定机制)。
    • 是的,他们必须使用锁……如果有 200 台服务器不断检查那台服务器,那这台服务器不会很忙吗?我认为一种方法是让单个服务器一次生成 1000 个这样的 base64 ID,注册它们,每次这 200 个服务器中的任何一个需要一些 ID,一次只给它们 1000 个
    • 如果你想在 JS 中执行此操作,NanoId 是首选包github.com/ai/nanoid
    • @nonopolarity 为什么不给每个服务器一个前缀?
    【解决方案3】:

    您最好的选择可能是简单地生成随机字符串,并跟踪(例如在数据库中)您已经使用过哪些字符串,以免重复。这很容易实现,如果正确实现(没有重复等),它不会失败。

    【讨论】:

      【解决方案4】:

      我建议使用完美的哈希函数:

      Perfect Hash Function for Human Readable Order Codes

      正如接受的答案所示,取一个数字,然后对该数字应用一系列“双射”(或可逆)运算以获得散列数字。

      输入的数字应按顺序排列:0、1、2、3,依此类推。

      【讨论】:

        【解决方案5】:

        在我看来,Eli 与 Jeff 文章的链接无关紧要。 URL 缩短与向世界展示 ID 不同。相反,更好的方法是将现有的整数 ID 转换为不同的 radix

        PHP 中的一个例子:

        $id = 9999;
        //$url_id = base_convert($id, 10, 26+26+10); // PHP doesn't like this
        $url_id = base_convert($id, 10, 26+10); // Works, but only digits + lowercase
        

        遗憾的是,PHP 最多只支持 36 进制(数字 + 字母)。 Base 62 将支持大写和小写字母。


        人们正在谈论这些其他系统:

        • 随机数字/字母 - 为什么?如果您希望人们看不到下一个视频 (id+1),那么只需将其设为私有即可。在像 youtube 这样的网站上,它会主动显示它拥有的任何视频,为什么还要使用随机 ID?
        • 散列 ID - 这种设计理念真的很糟糕。想想看;所以你有一个由你的 DBM 软件保证的 ID 是唯一的,然后你散列它(引入一个冲突因素)?给我一个理由来考虑这个想法。
        • 在 URL 中使用 ID - 老实说,我也不认为这有任何问题,尽管事实上你可以用更少的字母表示相同的数字(因此我的解决方案),它会变得很大。
        • 使用 Base64 - Base64 需要字节数据,实际上是从空值到空格的任何内容。当您的数据包含一个数字(即 10 个不同字符而不是 256 个字符的混合)时,为什么要使用此函数?

        【讨论】:

        • “在像 youtube 这样的网站上,它会主动显示它拥有的任何视频,为什么还要使用随机 ID?” -- 因为顺序编号系统可以非常轻松地批量下载视频。他们从一开始就开始了这件事,在 2005 年 Youtube 的早期,他们所有的内容都被抽走是一个非常现实的可能性。对于刚开始创建自己的视频托管网站(例如 OP)的任何人来说,这可能是一个问题。
        【解决方案6】:

        只需选择随机值,直到您从未见过。

        随机选取并耗尽所有值形成一个集合在预期时间运行O(nlogn):What is O value for naive random selection from finite set?

        在您的情况下,您不会用尽集合,因此您应该获得恒定的时间选择。只需使用快速的数据结构来进行重复查找。

        【讨论】:

          【解决方案7】:

          通常,您会以看起来不是数字的形式隐藏数字标识符。一种简单的方法是对数字进行 base-36 编码。您应该能够使用您选择的语言中的一个或另一个 itoa() 变体来实现这一目标。

          【讨论】:

            【解决方案8】:

            没有必要使用哈希。它可能只是通过 base64 或其他等价物传递的准随机 64 位值。

            所谓准随机,我的意思是它只是与计数整数的一对一映射,只是打乱了。

            例如,您可以将一个单调递增的数据库 id 乘以 2^64 附近的某个素数,然后得到 base64 的结果。如果您不希望人们能够猜测,您可能会选择更复杂的映射,或者只是选择一个尚未在数据库中的随机数。

            正常的 base64 会在末尾添加一个等号,但在这种情况下,它是隐含的,因为大小是已知的。字符映射很容易成为标准之外的东西。

            【讨论】:

            • “例如,您可以取一个单调递增的数据库 id 并将其乘以 2^64 附近的某个素数,然后得到 base64 的结果。” 为什么是素数?为什么这么大?我知道生成的 id 越大,越“安全”,但这是一个非常大的数字,尤其是在乘以标量 ID 之后,比如在亿值范围内。
            【解决方案9】:

            我认为 URL v 参数与内容(视频属性、标题、描述等)没有任何关系。

            它是一个随机生成的固定长度字符串,包含一组非常特定的字符。不允许重复。

            【讨论】:

              【解决方案10】:

              您可以生成一个 GUID 并将其作为视频的 ID。 导轨不太可能发生冲突。

              【讨论】:

                【解决方案11】:

                使用一些非平凡的散列函数。碰撞概率非常低,具体取决于函数、参数和输入域。请记住,加密哈希是专门设计用于非随机输入的冲突率非常低(即两个接近但不相等的输入的完全不同的哈希)。

                Jeff Attwood 的This post 很好地概述了该主题。

                还有here is 一个可以玩的在线哈希计算器。

                【讨论】:

                • YouTube 是否使用了哈希函数?
                • 为什么在不需要的时候还要允许发生碰撞的可能性?只需从 0000000000 开始 ID 并为每个新页面递增。如果这对您来说“看起来”不够随机,那么只需取几个大素数 P 和 Q,并使用序列 hash(n)=Pn mod Q
                • @cherovium:我没有参考资料。但我的回答是更笼统的“想法抛出”,而不是对 YouTube 的具体引用。毕竟,OP的问题始于“你会怎么做”...... :-)
                • @PeterAlexander 他们不会那样增加它,所以你不能查看私人视频
                猜你喜欢
                • 1970-01-01
                • 2018-03-09
                • 2015-10-26
                • 2012-02-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-15
                • 2012-09-03
                相关资源
                最近更新 更多