【问题标题】:Why do sites use random alphanumeric ids rather than database ids to identify content?为什么网站使用随机字母数字 ID 而不是数据库 ID 来识别内容?
【发布时间】:2015-02-16 21:26:28
【问题描述】:

为什么像 YouTube、Imgur 和大多数其他网站这样使用随机字符作为其内容 ID,而不仅仅是像 MySQL 中的自动增量创建的序列号?

解释我的意思:

在网址中:https://www.youtube.com/watch?v=QMlXuT7gd1I

最后的 QMlXuT7gd1I 表示该页面上的特定视频,但我假设视频在数据库中也有一个唯一的数字 id。他们为什么要创建和使用这个字母数字字符串,而不是仅仅使用视频的数据库 ID?

我正在创建一个站点,该站点可识别上述 URL 中的内容,但我目前仅使用 DB id。我正在考虑切换到随机字符串,因为所有主要网站都这样做,但我想在实施之前知道为什么这样做。

谢谢!

【问题讨论】:

  • 您无法确定 YouTube 的情况。字母数字标识符很可能是视频的各种元数据元素组合的散列值。 hash(ID, TIME, LENGTH)
  • 它可以将它们用作密钥,允许unlisted videos

标签: php database random alphanumeric


【解决方案1】:

有些网站这样做是因为分片。

当您只有一个进程(一台服务器)写入时,可以在没有重复 id 的情况下创建自动递增 id,但是当您有多个服务器(具有多个进程)写入内容时,例如 youtube,这是不可能的不再使用自动增量 ID。避免重复的同步成本将是巨大的。

例如,如果您阅读 mongodb's ocjectid documentation,您可以看到 id 的以下结构: 一个 4 字节的值,表示自 Unix 纪元以来的秒数, 一个 3 字节的机器标识符, 一个 2 字节的进程 ID,以及 一个 3 字节的计数器,以随机值开头。

最后,它只有 12 个字节。问题是当你用十六进制表示时,它看起来像 24 个字节,但那只是你显示它的时候。

该系统的另一个优点是时间戳包含在id中,因此可以将id解耦得到时间戳。

【讨论】:

  • 谢谢。这和克里斯蒂安的评论都有道理。
【解决方案2】:

首先,这不是一个随机字符串,它是一个依赖于 id 的基础计算。他们走这条路,因为字母数字的基数更大

99999999 这样的东西可能是1NJCHR

看看here,和基地一起玩,了解更多。

你会发现它要短得多。这是我能想象的唯一原因,有人会走这条路,这是有道理的,如果你有像54389634589347534985348957863457438959734这样的ID

正如selfCameron 评论/回答的那样,有可能(特别是对于 youtube)以某种方式计算了时间和长度等额外的安全参数,因此您无法猜测标识符。

【讨论】:

    【解决方案3】:

    除了上面 Christian 的回答之外,使用基础计算、散列值或其他非数字标识符的优势在于可以让竞争对手隐藏您的数据库大小。

    即使您使用数字并将您的 auto_increment 设置为从 50,000 开始、增加 50 等,仍然可以对数据库的大小和增长进行有根据的猜测。非数字选项并没有消除这种可能性,但它们在一定程度上抑制了这种可能性。

    【讨论】:

      【解决方案4】:

      最终用户有很大的机会进行恶意输入,并且不使用 id 用户无法猜测 id,因此无法猜测 db 有多大。但是其他人关于基本计算的答案解释得很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 2017-07-17
        • 2010-12-22
        相关资源
        最近更新 更多