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



Youtube似乎为每个视频都有一个唯一的11位代码。该代码包括1-9,A-Z,a-z和一些符号,如+_*

他们将如何计算每个视频的唯一代码?我正在做一些事情,我想为每个记录分配一个唯一的代码,所以这个问题就来了。

我的问题/担忧是:

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

我的目标是:

  • 为表中的记录创建一个唯一的代码
  • 用户可以与任何人共享带有该唯一代码的url
  • 当有人通过唯一代码进入时。然后,他们的"进来"被绑定到使用唯一代码共享url的原始用户

一般读取GUID和UID。

大多数情况下,如果您使用的数据库将为您生成一个唯一id,然后可以将该唯一id编码为数字和字母,以缩短生成的字符串。

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

缩短字符串是关于你对值进行编码的方式,它实际上不会改变它

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

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

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

Java甚至为您提供了这样做的函数,尽管这些函数的最大基数是36:

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

哈希函数对一组可能的URL进行哈希处理,然后对照索引数据库进行检查,问题是它消除了同步的可能性。考虑到上传视频所需的时间,对照他们的数据库进行检查几乎不需要时间,这不是问题所在。当你考虑预计算时,同样的问题也会发生:如果你想使用分布式计算机,那就需要在单个访问点上进行同步,我相信他们会这样做。我认为你的第三点可能最接近正确,然后由于某种原因,ID被编码成一个更长的数字(实际上我不确定它与int值相比有什么优势;有人有充分的理由吗?)

  1. 制作一个尽可能大的M大小的哈希表。

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

  3. 当筋疲力尽时,请按照下面链接中的算法建议进行操作(很抱歉重复使用类似问题的解决方案)。

生成唯一的电话号码

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

所有这些来来回回让我对youtube的后端进行了更多的研究。以下是我的想法。

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

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

我强烈怀疑这个id的一部分来自视频元数据存储的碎片的id。假设他们为碎片id贡献了24位(16777216)。他们可能使用了整个范围,但他们没有1600万个碎片。相反,他们可能会为每个碎片分配一系列这样的碎片id,以简化重新处理。指定视频的碎片id可能是伪随机的。当碎片开始填满时,他们会将其分割并更新范围。易于理解的

剩余比特的至少一部分可能是碎片本地的自动递增值。

如果在这之后还有任何比特,它们可能被伪随机数、时间戳或类似的东西占据。还有一种可能性是,它们包括其他特定于实现的数据,但如果它们必须迁移,这可能会导致大问题,所以我怀疑它们会回避这一点。

最新更新