【问题标题】:How can I generate a 6 digit unique number?如何生成 6 位唯一编号?
【发布时间】:2011-07-24 19:23:48
【问题描述】:

如何生成 6 位唯一编号?我有验证机制来检查重复条目。

【问题讨论】:

标签: php random


【解决方案1】:
$six_digit_random_number = random_int(100000, 999999);

当然,100,000 到 999,999 之间的所有数字都是六位数。

【讨论】:

  • 你知道这个方法产生了多少个随机数吗?如果得到相同的随机数呢?
  • @saleemahmed That's the problem with randomness, you can never be sure。不,真的,数字很可能重复但仍然是随机的。这很好。
  • 其他解决方案(Tim Cooper 和 Frosty Z)更好,因为它们也产生 1 到 100,000 之间的数字。
  • @SamuelLindblom 虽然这是真的,但这些数字的左侧是零,这可能会导致奇怪和副作用,包括被误解为八进制数字的可能性。通过将 100000 作为底部数字,您可以确保它始终被视为预期数字。
  • 这些类型的 6 位代码通常用于安全目的。因此值得注意的是,在 mt_rand 文档中,它建议不要将其用于这些目的,“注意此函数不会生成加密安全值,不应用于加密目的。如果您需要加密安全值,请考虑使用 random_int( )、random_bytes() 或 openssl_random_pseudo_bytes() 代替。"
【解决方案2】:

如果您希望它从000001 开始并转到999999

$num_str = sprintf("%06d", mt_rand(1, 999999));

请注意,它是以字符串形式存储的。

【讨论】:

  • 是随机的 (mt_rand) 还是顺序的(从 * 开始到 *)?
【解决方案3】:

另一个:

str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);

无论如何,为了唯一性,您必须检查您的号码是否未被使用。

您告诉您检查重复项,但要小心,因为当大多数号码将被使用时,获取新号码的“尝试”次数(以及因此花费的时间)会增加,可能会导致很长的延迟和浪费 CPU 资源。

如果可能的话,我建议跟踪数组中的可用 ID,然后通过执行类似操作(如果 ID 列表保存在内存中)随机选择一个 ID在可用 ID 中 ):

$arrayOfAvailableIDs = array_map(function($nb) {
    return str_pad($nb, 6, '0', STR_PAD_LEFT);
}, range(0, 999999));

$nbAvailableIDs = count($arrayOfAvailableIDs);

// pick a random ID

$newID = array_splice($arrayOfAvailableIDs, mt_rand(0, $nbAvailableIDs-1), 1);
$nbAvailableIDs--;

即使 ID 列表存储在数据库中,您也可以执行类似操作。

【讨论】:

    【解决方案4】:

    这是另一个:

    substr(number_format(time() * rand(),0,'',''),0,6);
    

    【讨论】:

      【解决方案5】:
      <?php
      $file = 'count.txt';
      
      //get the number from the file
      $uniq = file_get_contents($file);
      
      //add +1
      $id = $uniq + 1 ;
      
      // add that new value to text file again for next use
      file_put_contents($file, $id);
      
      // your unique id ready
      echo $id;
      ?>
      

      我希望这会正常工作。我在我的网站中使用了相同的技术。

      【讨论】:

        【解决方案6】:

        在 PHP 7.0+ 中,我建议使用random_int($min, $max) mt_rand()

        $randomSixDigitInt = \random_int(100000, 999999);
        

        来自 php.net:

        注意 此函数不会生成加密安全值,并且不应用于加密目的。如果您需要加密安全值,请考虑改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。

        所以这主要取决于上下文。我还要补充一点,从 PHP 7.1.0 开始,rand() 现在是 mt_rand() 的别名。

        干杯

        【讨论】:

        • 为什么?你应该说出原因
        【解决方案7】:

        有一些很好的答案,但许多使用标记为非加密安全的功能。如果您想要一个加密安全的随机 6 位数字,您可以使用以下内容:

        $key = random_int(0, 999999);
        $key = str_pad($key, 6, 0, STR_PAD_LEFT);
        return $key;
        

        这也将包括 000182 等数字以及其他本应从其他示例中排除的数字。

        您还可以使用循环使每个数字随机化,并根据您的需要生成包含尽可能多的数字的随机数:

        function generateKey($keyLength) {
            // Set a blank variable to store the key in
            $key = "";
            for ($x = 1; $x <= $keyLength; $x++) {
                // Set each digit
                $key .= random_int(0, 9);
            }
            return $key;
        }
        

        作为参考,random_int — 生成加密安全的伪随机整数,适用于对无偏结果至关重要的情况,例如在扑克游戏中洗牌时。" - php.net/random_int

        【讨论】:

        • 我只是在寻找想法/最有效的方法来生成 6 位双因素身份验证代码,这是最好的答案。
        • P.S.我会编辑,但它说我的队列已满。我建议进行以下编辑:1) "$key = str_pad(random_int(0, 999999), 6, "0", STR_PAD_LEFT);" (原始答案指定 9999999 是七位数字),以及 2)添加以下参考:“random_int - 生成加密安全的伪随机整数,适用于无偏结果至关重要的情况,例如将一副纸牌洗牌时扑克游戏。” - php.net/random_int
        • 谢谢你!您的回答简洁明了
        • @caffeinatedbits 很好地抓住了错字。我进行了您的更改并添加了第二个示例。
        【解决方案8】:
        $characters = '123456789';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < 6; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        $pin=$randomString; 
        

        【讨论】:

          【解决方案9】:

          这将生成随机的 6 位数字

          <?php
              mt_rand(100000,999999);
          ?>

          【讨论】:

          • 您的答案与@Charles 在 2011 年 3 月 28 日提供的答案有什么区别?
          • 没有区别.. :) @Trix
          【解决方案10】:

          我会使用一个算法,蛮力可以如下:

          第一次循环: 生成一个介于 100,000 到 999,999 之间的随机数并将其称为 x1

          第二次循环 生成一个100,000到x1之间的随机数调用这个xt2,然后生成一个x1到999,999之间的一个随机数调用这个xt3,然后随机选择x2或x3,调用这个x2

          第 N 次循环 生成 100,000 到 x1、x1 和 x2、x2 到 999,999 之间的随机数……

          注意端点,也要注意 x1

          【讨论】:

          • 但是为什么所有这些复杂性只是为了生成随机数?
          【解决方案11】:

          &lt;?php echo rand(100000,999999); ?&gt;

          你可以生成随机数

          【讨论】:

          • 由于这个问题已有 6 年历史,不知道这对已经发布的答案有多大影响。
          【解决方案12】:

          你可以使用 $uniq = round(microtime(true));

          它会根据时间生成 10 位数字 永远不会被复制

          【讨论】:

            【解决方案13】:

            使用 uniqid 和 hexdec 试试这个,

            echo hexdec(uniqid());
            

            【讨论】:

              【解决方案14】:

              在此之前这里给出的答案中,the one by "Yes Barry" 是最合适的答案。

              random_int(100000, 999999)
              

              请注意,这里我们使用random_int,它是在 PHP 7 中引入并使用加密随机生成器,如果您希望随机代码难以猜测,这一点很重要。 random_bytes 也在 PHP 7 中引入,同样使用加密随机生成器。

              许多其他用于随机值生成的解决方案,包括涉及time()microtime()uniqid()rand()mt_rand()str_shuffle()array_rand()shuffle() 的解决方案还有很多如果随机字符串用作密码、承载凭证、随机数、会话标识符、“验证码”或“确认码”或其他秘密值,则可预测且不适合。

              上面的代码生成一个 6 位十进制数字的字符串。如果你想使用更大的字符集(比如全大写字母、全小写字母和10位数字),这是一个更复杂的过程,但你必须使用random_intrandom_bytes而不是比rand()mt_rand()str_shuffle() 等,如果字符串将用作密码、“确认码”或其他秘密值。请参阅answer to a related question,另请参阅:generating a random code in php?

              在生成唯一标识符时,我还会列出other things to keep in mind,尤其是随机标识符。

              【讨论】:

                猜你喜欢
                • 2017-11-07
                • 1970-01-01
                • 2017-06-17
                • 1970-01-01
                • 2013-05-04
                • 2011-05-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多