我一直想知道他们为何以及为何这样做......例如:http://youtube.com/watch?v = DnAMjq0haic
如何生成这些ID,以便没有重复,这有什么优势,而不是简单的自动递增数字ID?
如何保持简短,但仍保持其独特性?uniqid创建的字符串非常长.
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
增加的唯一可能性...
base62或base64编码主键的值,然后将其存储在另一个字段中.
示例base62用于主键12443 = 3eH
节省一些空间,这就是为什么我确定youtube正在使用它.
在您的PK或唯一标识符上执行base62(A-Za-z0-9)编码将防止必须检查密钥是否已存在的开销:)
我有一个类似的问题 - 我在数据库中有主要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,并向用户显示哈希值.
编辑:
自增可以轻松抓取。这些无法预测,因此无法顺序爬取。
我建议使用双 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 个字符。