【问题标题】:How to create unique 6 to 8 digit code using php without replication如何在不复制的情况下使用 php 创建唯一的 6 到 8 位代码
【发布时间】:2019-12-05 21:22:21
【问题描述】:

我需要创建唯一的用户 ID,它不会不惜一切代价复制。因为,我正在使用这个 id 让用户登录,这也可以作为参考 id。 id 的长度可以是 6 到 8。到目前为止,我已经尝试过这个

 $v = mt_rand(10, 99);
 $b = date("s");
 $a = round(microtime(true));
 $c = substr($a, 8);

这会创建唯一的 id 吗?而且,我预计用户群将超过 1000 万。所以需要对超过 1000 万条记录进行无冲突。

【问题讨论】:

  • 您应该使用 UUID。 en.wikipedia.org/wiki/Universally_unique_identifier 不是 6-8 个字符,但是如果您想保证唯一性,6-8 个字符还不够,除非您将以前使用的值存储在某个地方。
  • 是的,我将其作为成员 ID 存储在数据库中! UUID太长,用户无法使用UUID登录
  • 我应该将以前使用的保存在单独的表中吗?

标签: php laravel


【解决方案1】:

您可以简单地使用 php uniqid() 函数来生成唯一 ID。

有关uniqid()功能的更多信息请参考以下链接

https://www.php.net/manual/en/function.uniqid.php

注意:上述函数也不能保证总是返回唯一值由于大多数系统通过 NTP 或类似的方式调整系统时钟,系统时间不断变化。为了增加唯一性,将 more_entropy 设置为 TRUE

uniqid ([ string $prefix = "" [, bool $more_entropy = FALSE ]] ) : string

【讨论】:

  • 伟大的开始 Theekshana。
  • 你可以运行这个函数 像这样,它应该返回一个输出
【解决方案2】:

在这里你可以这样做。

md5(uniqid(rand(), true))

请查看PHP: How to generate a random, unique, alphanumeric string?

【讨论】:

  • 我在谈论 6 到 8 位数字! UUID 不是我所期待的!
【解决方案3】:

考虑到您正在查看的长度,您不能依靠自己的解决方案来获得 100% 的唯一 ID。我建议您应该使用自动递增的主键,并在创建记录后,使用使用主键创建的值更新您的自定义 ID 列。

例如;创建一条记录并获取其整数 ID。然后像这样更新自定义 ID 列:

$user = User::create($data);
$user->custom_id = sprintf('user-%s', $user->id);
$user->save();

这样,您将能够使用短 ID,并确保 ID 是唯一的。

但正如其他答案中所建议的,您应该使用 UUID 库。这是经过多年用例开发的解决方案。

附言使用您自己指定的解决方案,您将在达到 1000 万目标之前经历 1000 次碰撞。此外,我以User::create() 为例创建了一条记录,只是因为您已将其标记为laravel

【讨论】:

    【解决方案4】:

    正如我在another question 中提到的:

    答案是使用unique identifier,它结合了“独特”部分和“随机”部分。

    • “唯一”部分可以是单调递增的计数器(例如数据库中的记录或行号),也可以是使用全周期 linear congruential generator 生成的数字(以伪随机方式循环遍历所有可能的值)在重复之前的时间段内)。
    • “随机”部分只是使用加密随机数生成器 [random_int 或 PHP 中的 random_bytes] 生成的随机数。一般来说,时间越长,预测的可能性就越小。

    此外,为了生成唯一标识符,几乎没有理由像现在这样将自己限制为 8 位标识符。

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      相关资源
      最近更新 更多