youtube如何计算每个视频的唯一11位数代码

时间:2013-12-09 21:59:58

标签: java algorithm youtube

Youtube似乎每个视频都有一个唯一的11位数代码。代码包含1-9,A-Z,a-z,以及+_*等符号。

他们如何计算每个视频的唯一代码?我正在做一些我想为每条记录分配一个唯一代码的东西,因此问题就在于此。

我的问题/疑虑是:

  1. 如果他们即时制作(提交视频时),那么他们必须检查为视频准备的代码是否已经存在?对于像他们这样的巨大数据集来说,这将是一项昂贵的操作。
  2. 他们会在每晚或每个月运行批处理作业,创建唯一代码并将其存储在数据库中。然后,当视频被提交时,它只需要一个代码并将其标记为“used”
  3. 为数据库中的每条记录采用自动生成和自动递增的ID列是否有意义,然后以某种方式将该唯一ID列转换为11位数代码?
  4. 我的目标是:

    • 为表中的记录创建唯一代码。
    • 用户可以与任何人共享具有该唯一代码的网址。
    • 当有人通过唯一代码进来时。然后他们的“进入”与使用唯一代码共享网址的原始用户绑定。

4 个答案:

答案 0 :(得分:2)

一般阅读GUID和UID。

大多数情况下,如果您使用的数据库会为您生成唯一ID,那么该唯一ID可以编码为数字和字母,以缩短生成的字符串。

http://en.wikipedia.org/wiki/Globally_unique_identifier

缩短字符串与编码值的方式有关,实际上并没有改变它。

例如,基数10中的数字15使用两位数,十六进制中它使用二进制中的一位数(f),它使用4(1111)。

以同样的方式,您可以使用a-z,A-Z,0-9并获得base 62,使用比使用基数10少得多的数字将数字编码为字符串。

这不是唯一的方法,但(特别是如果你已经拥有数据库行),这是最简单的方法。除非你真的想要,否则你甚至不需要填充到11 - 但是在编码字符串的开头添加任意数量的0不会改变它的值。

Java甚至提供了为您执行此操作的功能,尽管这些功能的最大基数为36:

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#toString%28int,%20int%29

答案 1 :(得分:1)

对整个可能的URL集合进行散列函数,然后针对索引数据库进行检查的问题在于它消除了同步可能性。考虑上传视频所需的时间,根据数据库检查视频几乎没有时间,这不是问题。当您考虑预先计算时会发生同样的问题:如果您想使用分布式计算机,则需要在单个访问点上进行同步,我相信他们会这样做。我认为你的第三点可能最接近正确,然后由于某种原因,该ID以某种方式被编码为更长的数字(我实际上不确定它的优势是什么与int值相比;任何人都有充分的理由? )

答案 2 :(得分:0)

这是有效地做到这一点的方法,也让它看起来像是随机的: -

  1. 制作一张M尺寸的哈希表,价格合理。

  2. 使用哈希表中的查找随机生成前M个数字。

  3. 用尽时请执行以下链接中建议的算法(抱歉重用类似问题的解决方案)。

  4. Generate unique phone numbers

    编辑: - 我知道给定的解决方案是针对数字的,但您始终可以使用每个数字的简单映射将数字转换为符号。

答案 3 :(得分:0)

所有这些来回使我对youtube的后端做了更多的研究。这就是我想出来的。

This让我相信他们正在使用MySQL来存储视频元数据。以下某些内容将取决于他们使用关系数据存储区的假设。

我认为带有11个字符的base64 id实际上是base64编码的64位值。 64^11 = (2^6)^11 = 2^66,这太接近2^64而非巧合。

我强烈怀疑此ID的一部分来自存储视频元数据的分片的ID。假设它们将24位(16,777,216)投入到分片ID中。它们可能使用整个范围,但它们没有1600万个分片。相反,它们可能会为每个分片分配一系列这些分片ID以简化重新分片。分配给定视频的分片ID可能是伪随机的。当分片开始填满时,它们会分割并更新范围。简单。

其余位的至少一部分可能是分片本地的自动递增值。

如果此后还有任何位,它们可能被伪随机数,时间戳或类似的东西占用。还有可能它们包含其他特定于实现的数据,但是如果它们不得不迁移那么可能会导致大问题,所以我怀疑它们会回避这一点。