Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java youtube如何计算每个视频的唯一11位代码_Java_Algorithm_Youtube - Fatal编程技术网

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

Java youtube如何计算每个视频的唯一11位代码,java,algorithm,youtube,Java,Algorithm,Youtube,Youtube似乎每个视频都有一个唯一的11位代码。代码包括1-9、A-Z、A-Z,以及一些符号,如+.*等 他们如何计算每个视频的唯一代码?我正在做一件事,我想给每个记录分配一个唯一的代码,所以问题就来了 我的问题/关注是: 如果他们在运行中(当视频被提交时)就必须检查为视频准备的代码是否已经存在?对于像他们这样的庞大数据集,这将是一项昂贵的操作 他们会每晚或每月运行一个批处理作业之类的东西,创建唯一的代码并将它们存储在数据库中。然后,在提交视频时,只需获取一个代码并将其标记为“已使用” 对于

Youtube似乎每个视频都有一个唯一的11位代码。代码包括
1-9、A-Z、A-Z
,以及一些符号,如
+.*

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

我的问题/关注是:

  • 如果他们在运行中(当视频被提交时)就必须检查为视频准备的代码是否已经存在?对于像他们这样的庞大数据集,这将是一项昂贵的操作
  • 他们会每晚或每月运行一个批处理作业之类的东西,创建唯一的代码并将它们存储在数据库中。然后,在提交视频时,只需获取一个代码并将其标记为“已使用”
  • 对于数据库中的每条记录,采用自动生成和自动递增的
    ID
    列,然后以某种方式将唯一的
    ID
    列转换为11位代码,这样做有意义吗
  • 我的目标是:

    • 为表中的记录创建唯一代码
    • 用户可以与任何人共享带有该唯一代码的url
    • 当有人通过唯一代码进来时。然后,他们的“进来”与使用唯一代码共享url的原始用户绑定
    阅读一般的GUID和UID

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

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

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

    同样,您可以使用a-z、a-z、0-9和get base 62将数字编码为字符串,使用的数字远远少于使用base 10的数字

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

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


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

    这里有一种方法可以有效地做到这一点,并且使它看起来是随机的:-

  • 制作一个尽可能大的M大小的哈希表

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

  • 当筋疲力尽时,请执行下面链接中的算法建议(抱歉,重复使用类似问题的解决方案)


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

    所有这些来回的操作让我对youtube的后端做了更多的研究。这是我想到的

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

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

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

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


    如果在此之后还有剩余的位,它们可能被伪随机数、时间戳或类似的东西占用。还可能包括其他特定于实施的数据,但如果他们必须迁移,这可能会导致大问题,因此我怀疑他们会回避这一点。

    缩短GUID是否会违背其唯一性的目的?编辑以添加更多解释。11位base64字符串包含66位,或略低于10^20位的可能性。可能足够好,但绝对不能防碰撞。但是,如果它包含一个全局时间戳(置换?),这可能就足够了。@JimGarrison我怀疑他们担心会破坏7378697600000000000个视频。我认为即使是谷歌也无法找到足够的驱动器来支持它that@Floegipoky它不是按顺序分配的编号。。。它是随机生成的(可能包含时间戳,也可能不包含时间戳),因此发生冲突的可能性很小。这些数字可能是内部顺序的,并以更简洁的表示形式表示,不存在重叠的可能性。您描述的字符集正好有64个值,这意味着表示可能只是以64为基数。这个问题似乎离题了,因为它要求读心术。