代码之家  ›  专栏  ›  技术社区  ›  BenB

YouTube URL算法?

  •  35
  • BenB  · 技术社区  · 15 年前

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

    例子:

    10 回复  |  直到 15 年前
        1
  •  28
  •   Eli Bendersky    15 年前

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

    This post 杰夫·阿特伍德对这个话题做了一个很好的概述。

    以及 here is 你可以玩的在线哈希计算器。

        2
  •  38
  •   Rahul Sharma Rashid Kurbanov    8 年前

    YouTube使用 比较基准64 编码为每个视频生成ID。生成ID所涉及的字符包括

    (A-Z)+(A-Z)+(0-9)+(-)+(\(64个字符)。

    对地球上的每个人来说,在18000年的时间里每分钟制作一次视频就足够了。

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

    请参阅此 video 详细解释。

        3
  •  11
  •   drawnonward    15 年前

    没有必要使用散列。它可能只是一个准随机的64位值,通过base64或其他等效值传递。

    所谓准随机,我的意思是,它只是一对一的整数映射,只是洗牌。

    普通base64会在末尾加一个equals,但在本例中,它是隐含的,因为大小是已知的。字符映射很容易成为标准之外的东西。

        4
  •  4
  •   Christian    12 年前

    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进制(数字+字母)。基62支持大写和小写字母。


    • 随机数/字母-为什么?如果你想让人们看不到下一个视频(id+1),那就把它设为私人的。在像youtube这样的网站上,它会主动展示自己拥有的任何视频,为什么还要用随机ID呢?
    • 在URL中使用ID-老实说,我也看不出有什么问题,尽管它会变得很大,但实际上你可以用更少的字母来表示相同的数字(因此我的解决方案)。
    • 使用Base64-Base64需要字节的数据,从空到空格。当您的数据由一个数字组成(即,由10个不同字符组成,而不是256个字符)时,为什么要使用此函数?
        5
  •  3
  •   Telavian    15 年前

    您可以生成一个GUID并将其作为视频的ID。 guid不太可能发生碰撞。

        6
  •  3
  •   Cam    12 年前

    最好的办法可能是简单地生成随机字符串,并跟踪(例如在DB中)已经使用的字符串,这样就不会重复。这是非常容易实现的,如果正确实现,它不会失败(没有重复的,等等)。

        7
  •  3
  •   AVX-42    6 年前

    您可以使用任何库或一些语言,如python在标准库中提供的库。

    例子:

    import secrets
    
    
    id_length = 12
    random_video_id = secrets.token_urlsafe(id_length)
    
        8
  •  1
  •   cherouvim    15 年前

        9
  •  1
  •   Community CDub    8 年前

    我建议使用一个完美的散列函数:

    Perfect Hash Function for Human Readable Order Codes

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

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

        10
  •  0
  •   Ian    15 年前

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

        11
  •  0
  •   Community CDub    8 年前

    只需选择随机值,直到你有一个从未见过的。

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

    在你的情况下,你不会用尽设置,所以你应该得到恒定的时间选择。只需使用一个快速的数据结构来进行重复查找。