如何创建YouTube等唯一ID?

Dig*_*den 21 php database

我一直想知道他们为何以及为何这样做......例如:http://youtube.com/watch?v = DnAMjq0haic

如何生成这些ID,以便没有重复,这有什么优势,而不是简单的自动递增数字ID?

如何保持简短,但仍保持其独特性?uniqid创建的字符串非常长.

chm*_*mac 20

Kevin van Zonneveld写了一篇很棒的文章,包括一个PHP函数来完成这个.他的方法是我在研究这个主题时发现的最好的方法.

他的功能非常聪明.它使用固定的$ index变量,因此可以删除有问题的字符(例如元音,或避免O和0混淆).它还可以选择混淆ID,以便它们不易被猜测.


DMC*_*MCS 18

试试这个:http://php.net/manual/en/function.uniqid.php

uniqid - 生成唯一ID ...

根据当前时间(以微秒为单位)获取带前缀的唯一标识符.

注意 此函数不会生成加密安全值,也不应用于加密目的.如果需要加密安全值,请考虑使用random_int(),random_bytes()openssl_random_pseudo_bytes().

警告 此功能不保证返回值的唯一性.由于大多数系统通过NTP等调整系统时钟,因此系统时间会不断变化.因此,该函数可能不返回进程/线程的唯一ID.使用more_entropy增加的唯一可能性...


Jas*_*son 9

base62或base64编码主键的值,然后将其存储在另一个字段中.

示例base62用于主键12443 = 3eH

节省一些空间,这就是为什么我确定youtube正在使用它.

在您的PK或唯一标识符上执行base62(A-Za-z0-9)编码将防止必须检查密钥是否已存在的开销:)


iva*_*mov 8

我有一个类似的问题 - 我在数据库中有主要ID,但我不想将它们暴露给用户 - 相反,显示某种哈希会好得多.所以,我写了哈希.

文档:http://www.hashids.org/php/

Souce:https://github.com/ivanakimov/hashids.php

使用此类创建的哈希值是唯一且可解密的.你可以提供一个自定义的盐值,这样其他人就无法解密你的哈希值(不是说这是一个大问题,但仍然是"有益的").

要加密数字,你会这样做:

require('lib/Hashids/Hashids.php');

$hashids = new Hashids\Hashids('this is my salt');
$hash = $hashids->encrypt(123);
Run Code Online (Sandbox Code Playgroud)

$hash现在会:YDx

您还可以将最小哈希长度设置为构造函数的第二个参数,以便您的哈希值可以更长.或者,如果您有一个复杂的集群系统,您甚至可以将多个数字加密为一个哈希:

$hash = $hashids->encrypt(2, 456); /* aXupK */
Run Code Online (Sandbox Code Playgroud)

(例如,如果群集2中有用户,主ID为456的对象)解密的工作方式相同:

$numbers = $hashids->decrypt('aXupK');
Run Code Online (Sandbox Code Playgroud)

$numbers然后是:[2, 456].

关于这一点的好处是你甚至不必将这些哈希值存储在数据库中.一旦请求进入并动态解密,您就可以从url获取哈希值 - 然后从数据库中提取主ID(这显然是速度上的优势).

与输出相同 - 您可以在出路时加密id,并向用户显示哈希值.

编辑:

  1. 更改了网址以包含doc网站和代码源
  2. 更改了示例代码以适应主lib更新(当前PHP lib版本为0.3.0 - 感谢所有用于改进lib的开源社区)


Sam*_*son 4

自增可以轻松抓取。这些无法预测,因此无法顺序爬取。

我建议使用双 url 格式(类似于 SO URL):

yoursite.com/video_idkey/url_friendly_video_title
Run Code Online (Sandbox Code Playgroud)

如果您需要 url 中的 id 和标题,则可以使用简单的数字,例如 0001、0002、0003 等。

生成这些密钥非常简单。您可以使用PHP 中的uniqid()函数生成 13 个字符,或者熵更多的 23 个字符。

  • 爬行有什么问题?无论如何,您不希望用户看到的任何页面都应该采取适当的保护措施...... (3认同)