Hashids是什么?
Hashids 是一个小型的 PHP 库,用于从数字生成类似 YouTube 的 ID。当你不希望将数据库的数字 ID 暴露给用户时,可以使用它:https://hashids.org/php
开始使用
在项目的根目录中,使用 Composer 要求这个包。
代码语言:javascript复制composer require hashids/hashids
然后你可以将类导入到你的应用程序中:
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids();
$hashids->encode(1);
“注意 Hashids 需要
bcmath
或gmp
扩展才能工作。
快速示例
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids();
$id = $hashids->encode(1, 2, 3); // o2fXhV
$numbers = $hashids->decode($id); // [1, 2, 3]
更多选项
向 encode()
函数传递输入 ID 的几种更多方式:
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids();
$hashids->encode(1, 2, 3); // o2fXhV
$hashids->encode([1, 2, 3]); // o2fXhV
$hashids->encode('1', '2', '3'); // o2fXhV
$hashids->encode(['1', '2', '3']); // o2fXhV
使输出 ID 唯一
通过传递一个项目名称来使你的输出 ID 唯一:
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids('My Project');
$hashids->encode(1, 2, 3); // Z4UrtW
$hashids = new Hashids('My Other Project');
$hashids->encode(1, 2, 3); // gPUasb
使用填充来使输出 ID 更长
Hashids 请注意,输出 ID 仅填充至至少一定长度。这并不意味着它们将恰好是那个长度。
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids(); // 无填充
$hashids->encode(1); // jR
$hashids = new Hashids('', 10); // 填充至长度 10
$hashids->encode(1); // VolejRejNm
使用自定义字母表
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids('', 0, 'abcdefghijklmnopqrstuvwxyz'); // 全小写
$hashids->encode(1, 2, 3); // mdfphx
编码十六进制而不是数字
如果你想要编码 MongoDB 的 ObjectIds,这很有用。请注意,可以传递的十六进制数字大小没有限制(它不必是 MongoDB 的 ObjectId)。
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids();
$id = $hashids->encodeHex('507f1f77bcf86cd799439011'); // y42LW46J9luq3Xq9XMly
$hex = $hashids->decodeHex($id); // 507f1f77bcf86cd799439011
陷阱
- 解码时,输出总是一个数字数组(即使你只编码了一个数字):
use HashidsHashids;
$hashids = new Hashids();
$id = $hashids->encode(1);
$hashids->decode($id); // [1]
- 不支持编码负数。
- 如果你向
encode()
传递无效输入,将返回一个空字符串:
use HashidsHashids;
$hashids = new Hashids();
$id = $hashids->encode('123a');
$id === ''; // true
- 不要使用这个库作为安全措施。不要用它来编码敏感数据。Hashids 不是一个加密库。
随机性
Hashids 的主要目的是混淆数字ID。它不是作为安全或压缩工具设计或测试的。话虽如此,这个算法确实试图使这些 ID 随机且不可预测,当编码多个相同的数字时(以下示例中显示了 3 个),没有显示模式:
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids();
$hashids->encode(5, 5, 5); // A6t1tQ
当编码一系列数字与分别编码它们时,也是如此:
代码语言:javascript复制use HashidsHashids;
$hashids = new Hashids();
$hashids->encode(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // wpfLh9iwsqt0uyCEFjHM
$hashids->encode(1); // jR
$hashids->encode(2); // k5
$hashids->encode(3); // l5
$hashids->encode(4); // mO
$hashids->encode(5); // nR