alexanderzon/hashids

从 hashids/hashids 分支而来:生成类似于YouTube或Bitly的hashids,用于将数据库主键id进行混淆,或者导航到正确的shard。

2.0.0 2015-04-09 08:03 UTC

This package is not auto-updated.

Last update: 2024-10-02 09:07:02 UTC


README

hashids

======

完整文档

一个小PHP类,用于生成类似YouTube的id。阅读文档请访问 http://hashids.org/php

hashids

安装

您可以通过 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-gmpBCMath 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 上,编码一个数字大约需要

  1. 0.000093秒
  2. 0.000240秒来解码一个id(同时确保它有效)。
  3. 0.493436秒来生成 10,000 个id(使用 for 循环)。

2.7 GHz Intel Core i7,16GB RAM 上,编码一个数字大约需要

  1. 0.000067秒
  2. 0.000113秒来解码一个id(并确保它有效)。
  3. 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

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 - 警告:此版本中的哈希值将改变

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 - 警告:此版本中的哈希值将改变

  • 更新了默认字母表(感谢@speps
  • 构造函数现在也会移除默认字母表中的重复字符(感谢 @speps

0.1.2 - 警告:此版本中哈希值已更改

  • 现在可以指定最小哈希长度
  • 哈希值增加了更多的随机性
  • 添加了单元测试
  • 添加了示例文件
  • 修改了可能抛出的警告
  • encode/decode 重命名为 encrypt/decrypt
  • 一致的洗牌操作不再依赖于md5
  • 速度提升

0.1.1

  • 速度提升
  • 错误修复

0.1.0

  • 首次提交

联系方式

我在互联网上 @IvanAkimov

许可证

MIT许可证。请参阅 LICENSE 文件。您可以在开源项目和商业产品中使用Hashids。不要破坏互联网。谢谢。