qranio-com/hashids

生成像YouTube或Bitly这样的哈希值,从数字到混淆您的数据库ID,或者导航到正确的分片。

dev-master / 0.3.x-dev 2014-05-21 19:25 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:45:57 UTC


README

hashids

======

完整文档

一个小的PHP类,用于从数字生成类似YouTube的哈希值。请阅读http://www.hashids.org/php/上的文档。

hashids

安装

您可以选择自己 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-gmpBCMath任意精度数学 --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 上,加密一个数字大约需要

  1. 0.000067秒
  2. 0.000113秒来解密一个哈希值(并确保它有效)。
  3. 0.297426秒来在 for 循环中生成 10,000 个哈希值。

2.26 GHz Intel Core 2 Duo,8GB RAM 上,大约需要

  1. 0.000093秒来加密一个数字。
  2. 0.000240秒来解密一个哈希值(同时确保它有效)。
  3. 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 - 警告:在此版本中哈希值发生变化

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。不要破坏互联网。谢谢。