【问题标题】:Create unique id with a length of 5 in PHP在 PHP 中创建长度为 5 的唯一 id
【发布时间】:2013-02-18 08:13:58
【问题描述】:

我知道uniqid() 方法可以创建许多长度为 7 或更多的唯一 id,但我想要创建的是长度为 5 且没有冲突的唯一 id。

是否可以创建 220.000 个长度为 5 的唯一 id 并检查是否有任何冲突?

【问题讨论】:

  • 抱歉,字母和数字应该能够创建超过 220.00 个唯一 ID?
  • 提交后才意识到。我总是将 ID 视为int :)
  • 假设您采用英文字母(26 个字符)和数字字符 0-9,我们总共有 36 个字符。然后唯一组合的数量由 36^5 = 60466176 给出所以这应该绰绰有余
  • 太棒了!以及如何做到这一点:-/

标签: php mysql


【解决方案1】:

我想使用uniqid() 函数来制作特定长度的字符串。因此,我进行了实验并提出了以下代码:

<?php
    $number = uniqid();
    $varray = str_split($number);
    $len = sizeof($varray);
    $otp = array_slice($varray, $len-5, $len);
    $otp = implode(",", $otp);
    $otp = str_replace(',', '', $otp);
    print_r($otp);
?>

这对我来说很好,只要您的网站不以非常快的速度生成 OTP,这应该可以正常工作!

【讨论】:

    【解决方案2】:

    看看这篇文章

    它解释了如何从您的 bdd id 生成简短的唯一 id,就像 youtube 一样。

    实际上,文章中的函数与php function base_convert 非常相关,它将一个数字从一个基数转换为另一个数(但最多只能以36为基数)。

    【讨论】:

      【解决方案3】:

      你可以试试

      for($i = 0; $i < 10 ; $i++)
      {
          echo randString(5),PHP_EOL ;
      }
      

      输出

      7fh96
      G93fd
      97Q7E
      90Wku
      7Vby9
      4678f
      S11oe
      67688
      19D36
      KC1bQ
      

      简单的碰撞测试

      $hash = array();
      $collision = 0;
      while ( count($hash) < 220000 ) {
          $r = randString(5);
          if (isset($hash[$r])) {
              $collision ++;
              continue;
          }
          $hash[$r] = 1;
      }
      
      print(($collision / 220000)  * 100 . "% - ($collision)");
      

      Tested 100,000 times and always collision is always less that 0.02 这使得函数对 5 个字符集有效

      0.011818181818182% - (26)
      

      使用的功能

      function randString($length) {
          $char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
          $char = str_shuffle($char);
          for($i = 0, $rand = '', $l = strlen($char) - 1; $i < $length; $i ++) {
              $rand .= $char{mt_rand(0, $l)};
          }
          return $rand;
      }
      

      【讨论】:

      • 这些不是无冲突的,因此您可以将它们存储为数组键并执行此操作直到您的数组有 220.000 个键
      • @JaMaBing 快速测试显示该函数显示有关0.1181 碰撞.. 如果已存储,则可以轻松解决见codepad.viper-7.com/S0W8U1
      • 我知道,但他不要求随机字符串。因此,如果他在没有碰撞检测的情况下实施了您的解决方案,那么他以后就会遇到麻烦。
      • is it possible to create 220.000 unique id's with a length of 5 and check if there is any collision. 他已经打算检查碰撞
      • @TedMosby 没有碰撞检测当然是不可能的;根据您的字母大小和所需的代码数量,概率至少为 0.024%。 birthday attack 让胜算更大。
      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多