qranio-com / hashids
生成像YouTube或Bitly这样的哈希值,从数字到混淆您的数据库ID,或者导航到正确的分片。
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-28 15:45:57 UTC
README
======
完整文档
一个小的PHP类,用于从数字生成类似YouTube的哈希值。请阅读http://www.hashids.org/php/上的文档。
安装
您可以选择自己 require()
库,或者使用 Composer(packagist有hashids/hashids软件包)。
在您的 composer.json
文件中,使用以下内容:
{ "require": { "hashids/hashids": "*" } }
然后运行:php composer.phar install
。之后,您可以引入自动加载器并使用Hashids
<?php require_once 'vendor/autoload.php' $hashids = new Hashids\Hashids('this is my salt');
示例用法
<?php $hashids = new Hashids\Hashids('this is my salt'); $hash = $hashids->encrypt(1, 2, 3); $numbers = $hashids->decrypt($hash); var_dump($hash, $numbers);
string(5) "laHquq"
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
大数字
传递给构造函数的每个数字 不能是负数 或 大于10亿(1,000,000,000)。如果至少有一个数字超出范围,Hashids的 encrypt()
函数将返回空字符串。请确保检查这一点--不会抛出异常。
PHP在执行大整数的算术运算时开始近似数值(通过将它们转换为浮点数)。这通常不是大问题,但如果需要精确的整数,则可能成为问题。
然而,如果您安装了GNU多重精度 --with-gmp 或 BCMath任意精度数学 --enable-bcmath 库,Hashids将将其上限增加到 PHP_INT_MAX
,在32位系统上是 int(2147483647),在64位系统上是 int(9223372036854775807)。
然后,它将使用常规算术对小于10亿的数字进行计算(因为更快),如果大于这个数字,则使用这些库之一。GMP优先于BCMath。
您可以通过执行以下操作来获取上限:$hashids->get_max_int_value();
(如果没有安装这些库之一,将保持为10亿)。
速度
尽管速度是每个哈希算法的重要因素,但此处的首要目标是同时编码多个数字,同时避免冲突。
在 2.7 GHz Intel Core i7,16GB RAM 上,加密一个数字大约需要
- 0.000067秒。
- 0.000113秒来解密一个哈希值(并确保它有效)。
- 0.297426秒来在
for
循环中生成 10,000 个哈希值。
在 2.26 GHz Intel Core 2 Duo,8GB RAM 上,大约需要
- 0.000093秒来加密一个数字。
- 0.000240秒来解密一个哈希值(同时确保它有效)。
- 0.493436秒来在
for
循环中生成 10,000 个哈希值。
注意:测试的数字相对较小--如果您增加它们,速度显然会降低。
哎呀!#$%@
编写此代码的目的是将创建的哈希值放置在可见位置,例如URL。因此,如果生成的哈希值意外形成了不雅之词,则可能不幸。
因此,算法试图避免生成大多数常见的英语诅咒词。这是通过从不将以下字母放在一起来实现的:
c, C, s, S, f, F, h, H, u, U, i, I, t, T
备注
- 如果您想进一步提高性能,请设置较短的字母表。哈希值将更不随机且更长,但计算它们将更快。
变更日志
0.3.1
- 添加了对 encrypt_hex() 和 decrypt_hex() 的支持
- 小问题:在 encrypt() 函数中放宽了整数检查(现在可以传递数字字符串)
0.3.0 - 警告:在此版本中哈希值发生变化
- 错误修复:更好地处理大数字:vinkla#3(感谢 @tobsn 和 @miquelfire)
- 错误修复:构造函数中抛出异常
- 默认最大数字设置为100亿:1,000,000,000。除非您已安装GNU 多精度库或BCMath任意精度数学库,否则使用
PHP_INT_MAX
。 - 清理:私有变量使用下划线
0.2.1
- 通用目录清理和改进
- 现在对于PHP 5.3和PHP 5.4都只有一个库文件
- 常量使用大写字母
- 将命名空间
Hashids
添加到库类中
0.2.0 - 警告:在此版本中哈希值发生变化
- 总体上约快4倍
- 一致的洗牌函数使用略微修改的Fisher–Yates算法
- 更快地生成大型哈希字符串(超过1000个字符)
- 在使用最小哈希长度参数时,哈希字符的无序性已得到改进
- 即使是自定义字母表,现在也将避免基本英语粗话
- 类名从
hashids
更改为Hashids
- 使用PHPUnit添加了新的单元测试(需要最新PHP)
- Composer包位于packagist:https://packagist.org.cn/packages/hashids/hashids
- 小问题:整体代码更小 -- 更有动力将其移植到其他语言 :P
0.1.3 - 警告:在此版本中哈希值发生变化
0.1.2 - 警告:在此版本中哈希值发生变化
- 现在可以指定最小哈希长度
- 增加了更多随机性到哈希中
- 添加了单元测试
- 添加了示例文件
- 更改了可能抛出的警告
- 将
encode/decode
重命名为encrypt/decrypt
- 一致的洗牌不再依赖于md5
- 速度改进
0.1.1
- 速度改进
- 错误修复
0.1.0
- 第一次提交
联系方式
我在互联网上@IvanAkimov
许可
MIT许可。请参阅LICENSE
文件。您可以在开源项目和商业产品中使用Hashids。不要破坏互联网。谢谢。