alexanderzon / hashids
从 hashids/hashids 分支而来:生成类似于YouTube或Bitly的hashids,用于将数据库主键id进行混淆,或者导航到正确的shard。
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-10-02 09:07:02 UTC
README
======
完整文档
一个小PHP类,用于生成类似YouTube的id。阅读文档请访问 http://hashids.org/php
安装
您可以通过 Composer 安装Hashids(packagist有 hashids/hashids 包)。在您的 composer.json
文件中使用
{ "require": { "alexanderzon/hashids": "2.0.*" } }
然后运行: php composer.phar install
。之后您就可以引入自动加载器并使用Hashids了
<?php require_once 'vendor/autoload.php' $hashids = new Hashids\Hashids('this is my salt');
从v0.3更新到1.0?
请阅读下面的 CHANGELOG
!
示例用法
使用Hashids的最简单方法
<?php $hashids = new Hashids\Hashids(); $id = $hashids->encode(1, 2, 3); $numbers = $hashids->decode($id); var_dump($id, $numbers);
string(5) "laHquq"
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
以及一个包含所有自定义参数的示例(唯一的盐值、最小id长度、自定义字母表)
<?php $hashids = new Hashids\Hashids('this is my salt', 8, 'abcdefghij1234567890'); $id = $hashids->encode(1, 2, 3); $numbers = $hashids->decode($hash); var_dump($id, $numbers);
string(5) "514cdi42"
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
哎呀!#$%@
这段代码的目的是将创建的id放在可见的位置 - 比如URL中。如果生成的hashids意外地形成了一个糟糕的词,那就很不幸了。
因此,该算法试图避免生成大多数常见的英文诅咒词。这是通过永远不会将以下字母相邻放置来实现的
c, C, s, S, f, F, h, H, u, U, i, I, t, T
大数字
传递给构造函数的每个数字 不能为负 或 默认情况下不能大于10亿(1,000,000,000)。如果至少有一个数字超出范围,Hashids encode()
函数将返回一个空字符串。请确保检查这一点 - 不会抛出异常。
PHP在执行大整数的算术运算时开始近似数字(通过将它们转换为浮点数)。这通常不是一个大问题,但当需要精确的整数时,会成为一个问题。
但是,如果您安装了 GNU Multiple Precision --with-gmp 或 BCMath Arbitrary Precision Mathematics --enable-bcmath 库,Hashids将将其上限增加到 PHP_INT_MAX
,在32位系统上是 int(2147483647),在64位系统上是 int(9223372036854775807)。
然后它将对小于10亿的数字使用常规算术(因为它更快),对于大于这个数字的数字使用这些库之一。GMP优先于BCMath。
您可以通过执行 $hashids->get_max_int_value();
来获取上限(如果未安装这些库之一,则将保持在 10亿)。
速度
尽管速度是每个散列算法的一个重要因素,但主要目标是在避免冲突的同时一次性编码多个数字。
在 2.26 GHz Intel Core 2 Duo,8GB RAM 上,编码一个数字大约需要
- 0.000093秒。
- 0.000240秒来解码一个id(同时确保它有效)。
- 0.493436秒来生成 10,000 个id(使用
for
循环)。
在 2.7 GHz Intel Core i7,16GB RAM 上,编码一个数字大约需要
- 0.000067秒。
- 0.000113秒来解码一个id(并确保它有效)。
- 0.297426秒来生成 10,000 个id(使用
for
循环)。
备注:测试的数字相对较小 -- 如果您增加它们,速度自然会降低。
备注
- 如果您想要获取更高的性能,设置一个更短的字母表。hashids将变得不那么随机,但计算速度会更快。
变更日志
2.0.0:
- 解码函数在仅提供一个元素给编码函数时将返回一个字符串或整数(感谢@AlexanderZon)
1.0.5:
- 修复了传递空数组给
encode
的bug(感谢@bpahan)
1.0.3 & 1.0.4:
- 调整示例(感谢@Trismegiste)
- 正确升级
const VERSION
1.0.2
- PSR-2清理 + 接口更改(感谢@Trismegiste)
encode()
可以接受整数数组(感谢@leunggamciu)
1.0.1
- 修复了
encode_hex()
的bug(感谢@leihog) - 为
encode_hex()/decode_hex()
编写单元测试
1.0.0
-
将几个公共函数重命名以更合适
- 函数
encrypt()
更改为encode()
- 函数
decrypt()
更改为decode()
- 函数
encrypt_hex()
更改为encode_hex()
- 函数
decrypt_hex()
更改为decode_hex()
Hashids被设计用来编码整数,最多为主键。我们收到了一些用Hashids加密敏感数据的请求,这是错误的做法。所以为了鼓励更合适的使用,
encrypt/decrypt
将被“降级”为encode/decode
。 - 函数
-
添加了版本标签:
1.0
-
README.md
已更新
0.3.1
- 添加了对encrypt_hex()和decrypt_hex()的支持
- 小改进:在encrypt()函数中放宽了整数检查(现在可以传递数字字符串)
0.3.0 - 警告:此版本中的哈希值将改变
- bug修复:更好地处理大数字:vinkla#3(感谢@tobsn和@miquelfire)
- bug修复:构造函数中的异常抛出
- 默认最大数字设置为10亿:1,000,000,000。除非您已安装GNU Multiple Precision或BCMath Arbitrary Precision Mathematics库,否则使用
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。不要破坏互联网。谢谢。