hashids(整数生成唯一字符串)

2019-10-25 13:50:16   Packagist

  hashids,id  

github地址 官方地址

场景

在做二维码链接时,发现如果将二维码的参数暴露,用户可以获取到该二维码的数量并推测前后数据,所以引发我对hashids的使用需求。当然hashids的使用场景和范围其实很大。例如对视频图片等资源进行进行id加密,防止被第三方直接遍历抓取资源。生成指定位数的不重复的用户的推荐码等。

使用

1.通过composer安装到你的框架中
 composer require vinkla/hashids  
2. 在config/app.php中的providers数组中添加(laravel5.5以上不需要)
Vinkla\Hashids\HashidsServiceProvider::class
3. 在config/app.php中的aliases数组中添加
'Hashids' => Vinkla\Hashids\Facades\Hashids::clas
4. 以config下生成hashids.php配置文件
php artisan vendor:publish
5. 修改config文件夹下hashids.php中的connections的盐值和加密输出长度
其中盐值可以是任意长度任意字符的字符串,加密和盐值有直接的关系,盐值是解密的钥匙。我直接取项目的密钥作为其盐值,以让项目统一,且不同项目的加密结果不一样。

'connections' => [
  'main' => [
        'salt' => env('APP_KEY'),
        'length' => '16',
    ],
    'alternative' => [
        'salt' => env('APP_KEY'),
        'length' => '6',
    ],
    'recommend' => [
        'salt' => env('APP_KEY'),
        'length' => '6',
    ],
],
6. Hashids的加密解密使用方式
加密的使用方式
use Vinkla\Hashids\Facades\Hashids;
Hashids::encode(123);//返回经过加密后的字符串a9M4pPZqO0rJ6QWK
解密的使用方式
注意返回值是数组
use Vinkla\Hashids\Facades\Hashids;
Hashids::decode('a9M4pPZqO0rJ6QWK');//返回经过解密后的数组[123]
同时加密多个参数
use Vinkla\Hashids\Facades\Hashids;
Hashids::encode(1,2,3);//M0BKxg8cYSNrVAjp
解密多个参数的加密字符串
use Vinkla\Hashids\Facades\Hashids;
Hashids::decode('M0BKxg8cYSNrVAjp')//返回经过解密后的数组[1,2,3]
切换不同的盐值和加密长度
我们可能需要对多个不同类型的id进行加密,盐值和返回长度也各有不同。所以config的hashids中的多个数组可以派上用场了。其中main数组是作为默认连接,可以自行添加其他的加密数组。
use Vinkla\Hashids\Facades\Hashids;
Hashids::connection('recommend')->encode(1);
Hashids::connection('recommend')->decode("1111");