wotz/unique-codes

生成独特、看起来随机的代码

3.0.0 2024-09-26 11:33 UTC

README

Latest Version on Packagist Total Downloads

此包生成独特、看起来随机的代码。这些代码可用于优惠券、折扣券等。现在您无需检查代码是否已生成过,即可生成数千或数百万个代码。

use Wotz\UniqueCodes\UniqueCodes;

// Generate 100 unique codes for numbers 1 to 100
$codes = (new UniqueCodes())
    ->setObfuscatingPrime(9006077)
    ->setMaxPrime(7230323)
    ->setCharacters('LQJCKZMWDPTSXRGANYVBHF')
    ->setLength(6)
    ->generate(1, 100);

// Result: LWXNHJ (1), LACSVK (2), QLNMNM (3), ... , LYMJHL (100), QJVBVJ (101), LQXGQC (102), ... , LJQ5DJ (7230320), LC17CS (7230321), LZ8J8H (7230322)

安装

您可以通过composer安装此包

composer require wotz/unique-codes

不要使用此包的v1版本,因为它包含错误。如果您目前使用v1版本,您应该升级到v2(阅读升级指南!)。

使用

Generate() 方法

要生成唯一代码,您需要提供起始和结束数字。它将使用该范围内的数字生成代码。每个数字都将生成相同的独特、看起来随机的代码。这意味着您应确保您不会再次使用相同的数字。这可以通过保存您已经使用的数字范围或始终使用代码数据库表中的下一个自动递增的ID来实现。

如果需要同时生成大量代码,可能会造成大量内存使用。为了防止这种情况,默认返回一个 生成器。如果您想要一个数组,可以将 generate 方法的第三个参数设置为 true。如果您想要根据一个数字生成一个代码,只需设置 generate 方法的第一个参数即可。

// Returns generator to create codes for numbers 1 to 100.
->generate(1, 100);

// Returns array with created codes for numbers 1 to 100.
->generate(1, 100, true);

// Returns string with created code for number 100.
->generate(100);

设置器

某些设置器是生成唯一代码所必需的

  • setObfuscatingPrime()
  • setMaxPrime()
  • setCharacters()
  • setLength()

setObfuscatingPrime($number)

此素数用于将数字1和最大素数之间的数字混淆。此素数必须大于您提供给 setMaxPrime 方法的最大素数。

setMaxPrime($number)

最大素数决定了您可以生成的最大唯一代码数量。如果您提供 101,则可以生成从1到100的代码。此素数必须小于您提供给 setObfuscatingPrime 方法的素数。

setCharacters($string)

字符列表包含可用于构建唯一代码的所有字符。

setLength($number)

每个唯一代码的长度。

setPrefix($string)

每个唯一代码的前缀。

setSuffix($string)

每个唯一代码的后缀。

setDelimiter($string, $number)

可以将代码分割成不同的部分,并使用指定的分隔符将它们粘合在一起。

它是如何工作的?

代码生成由2个步骤组成

  • 混淆顺序数字
  • 编码混淆的数字

混淆顺序数字

如果您编码顺序数字,您仍然会看到编码的字符串是顺序的。为了去除顺序性,我们使用 '模乘法逆元'。

您定义您范围的最高限制。这决定了您可以混淆的最大数字。然后每个数字都被映射到1和最高限制之间的唯一混淆数字。您将输入数字与一个随机(较大的)素数相乘,并确定您的乘积输入数字除以范围最高限制的余数。

$obfuscatedNumber = ($inputNumber * $obfuscatingPrimeNumber) % $maxPrimeNumber

编码混淆的数字

在下一步中,混淆的数字被编码成字符串。这只是一个基于除法和取模的基数转换。

测试

composer test

代码检查

composer lint

变更日志

请参阅变更日志以获取有关最近更改的更多信息。

贡献

请参阅贡献指南以获取详细信息。

致谢

本包深受Jim Mischel撰写的两篇文章的启发

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。