Keygen 包简介

有些时候,我们的业务需要生成随机字符串,数字甚至字节,例如:用户ID,API密钥,验证令牌等。自己写生成算法的话比较麻烦,今天正好看到 Keygen 包可以轻松完成这些。

简单记录一些用法。

安装 Keygen

使用 composer 安装:

composer require gladcodes/keygen

生成数字

数字通常用来作为 ID。可以通过调用 Keygen\Keygen 类的 numeric() 方法生成。它带有一个可选的长度参数,用来指定数字的长度,如果省略或者格式错误,则默认为16。

<?php

require __DIR__ . '/vendor/autoload.php';
use Keygen\Keygen;

$id_12 = Keygen::numeric(12)->generate();
$id_16 = Keygen::numeric()->generate();

echo $id_12; // 011683218639
echo $id_16; // 9352941287643963

通常情况下,我们不会使用零开头的数字。需要对代码进行细微的修改,以确保在数字的开头没有零。 以下代码片段创建一个自定义函数来包装生成机制。

<?php

require __DIR__ . '/vendor/autoload.php';
use Keygen\Keygen;

function generateID($length = null) {
    $length = is_int($length) ? $length : null;

    return Keygen::numeric($length - 1)->prefix(mt_rand(1, 9))->generate(true);
}

$id_12 = generateID(12);
$id_16 = generateID();

echo $id_12; // 473840499215
echo $id_16; // 2684603281019122

上面的代码使用 prefix() 方法在数字的开头添加一个非零整数。Keygen 软件包还提供了一个 suffix() 方法,用于在生成的密钥末尾添加字符。 有关 Keygen 软件包功能的更多详细信息,例如:Key Affixes 和 Key Transformations,请参阅 Keygen 软件包的 README 文档。

生成字符串和 Token

字符串是包含大写字母,小写字母和数字组合的随机字符序列。它可以通过静态调用 Keygen\Keygen 类的 alphanum() 方法生成,其方法与 numeric() 方法非常相似。

Token 是随机的 base64 编码的字符串。它通常用作应用程序的秘密和 API 密钥。它可以由 Keygen\Keygen 类的 token() 方法生成。

<?php

require __DIR__ . '/vendor/autoload.php';
use Keygen\Keygen;

$alnum = Keygen::alphanum(15)->generate();
$token = Keygen::token(28)->generate();

echo $alnum; // TFd5X74Pr9ZOiG2
echo $token; // 4HE1xQz+4ks0Td128KSO/kBivd79

生成随机字节

还通过调用 Keygen\Keygen 类的 bytes() 方法来生成随机字节。

一般情况下随机字节不是很有用,所以,Keygen 包提供了十六进制(hex)的随机字节的 hex() 方法。

<?php

require __DIR__ . '/vendor/autoload.php';
use Keygen\Keygen;

$bytes = Keygen::bytes(20)->generate();
$hex = Keygen::bytes(20)->hex()->generate();

echo $bytes; // 
echo $hex; // 9f802a80aaf4b5e89e14

值类型转换

Keygen 软件包允许在生成密钥之前对密钥做一次或多次转换。转换只是一种可调用的方法,可以将生成的键作为第一个参数并返回一个字符串。 每次转换在生成的密钥上按照它们在返回密钥前指定的顺序执行。

<?php

require __DIR__ . '/vendor/autoload.php';
use Keygen\Keygen;

$reference = Keygen::numeric(20)->generate(function($key) {
    return join('-', str_split($key, 4));
});

$filename = Keygen::bytes()->suffix('.png')->generate(true, ['strrev', function($key) {
    return substr(md5($key), mt_rand(0,8), 20);
}], 'strtoupper');

echo $reference; // 2129-1489-0676-5152-9337
echo $filename; // 159D702E346F74E3F0B6.png