【问题标题】:PHP code for generating decent-looking coupon codes (mix of letters and numbers)用于生成漂亮优惠券代码的 PHP 代码(字母和数字的组合)
【发布时间】:2011-04-01 02:24:35
【问题描述】:

对于电子商务网站,我想生成一个看起来比随机生成的值更好的随机优惠券代码。它应该是一个可读的优惠券代码,全部大写,没有特殊字符,只有字母 (A-Z) 和数字 (0-9)。

由于人们可能会在其他地方阅读/打印此内容,因此我们也需要将其设为易于交流的值,长度可能为 8-10 个字符。

大概是这样的,

AHS3DJ6BW 
B83JS1HSK

(我输入的,所以不是那么随机)

【问题讨论】:

  • 作为问题的旁注,请确保您保留使用过的密钥的记录,以免创建重复!
  • 哇——谢谢大家!我们能否对每个函数的速度有一些估计(或真实数据!)?我在一台 Windows 机器上试了一个,一秒钟就弹出 5 个!
  • 因为您可能需要跟踪结果,以免创建重复项(如 Stephen 建议的那样),您可以预先计算一大堆代码并将它们存储在数据库中。然后,您可以抓取下一行,并将其标记为已使用。这也可能有助于克服任何速度问题。
  • 如果这是供人们阅读和交流的,您可能希望排除 I1O0

标签: php random


【解决方案1】:

您可以使用优惠券代码生成器PHP类文件来生成N张优惠券及其可定制的,具有添加自己的前缀和后缀的自己的掩码的各种选项。 Simple PHP coupon code generator

示例: coupon::generate(8); // J5BST6NQ

【讨论】:

    【解决方案2】:
    $size = 12;
    
    $string = strtoupper(substr(md5(time().rand(10000,99999)), 0, $size));
    

    【讨论】:

      【解决方案3】:

      如果对这些没有安全要求,那么您实际上不需要随机生成的代码。我只会使用增量 ID,例如由您使用的任何 RDBMS 生成的 ID。或者,如果您有不同类型的优惠券,您可以在代码前面加上一些东西,例如:

      CX00019 QZ0001C
      CX0001A QZ0001D
      CX0001B QZ0001E
      

      或者,您甚至可以在优惠券中使用字典单词,因为这样的优惠券代码更容易记住并且用户输入速度更快。 Dreamhost 等公司将这些用于他们的促销代码,例如:

      Promo60
      NoSetupFee
      YELLOWGORILLA82
      

      其中一些显然是人为创建的(您可能想要选择),但它们也可以使用字典列表生成。但即使它们是随机生成的无意义短语,字符遵循逻辑模式这一事实仍然使其比R7QZ8A92F1 之类的用户友好得多。所以我强烈建议不要仅仅因为它们“看起来很酷”而使用后一种类型的优惠券代码。您的客户会感谢您的。

      【讨论】:

        【解决方案4】:

        为什么不保持简单?

        <?php
            echo strtoupper(uniqid());
        ?>
        

        总是返回 13 个字符长的大写随机代码。

        【讨论】:

        • 这很好... 0.18964600563049 秒 10000 。但是它似乎不太随机......前6-8个字符在我的机器上是相同的......
        • 可以通过添加前缀参数来扩展uniqid()函数:strtoupper(uniqid(substr(sha1(time()), 0, 2)));
        【解决方案5】:
        $length = 9;
        $code   = (strtoupper(substr(md5(time()), 0, $length)));
        

        【讨论】:

          【解决方案6】:
          $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
          $res = "";
          for ($i = 0; $i < 10; $i++) {
              $res .= $chars[mt_rand(0, strlen($chars)-1)];
          }
          

          您可以通过预分配$res 字符串并缓存strlen($chars)-1 的结果来优化这一点。这留给读者作为练习,因为您可能不会每秒生成数千张优惠券。

          【讨论】:

          • 现在确保它永远不会添加超过 4 位数字 :)
          • @Power 不是问题的要求:p
          • 这为 10000 提供了 0.4421501159668 秒的性能
          • @QAQ 我得到 0.652 的未优化版本和 0.475 的优化版本 100 000(不是 10 000)。您的计算机似乎不是很快。
          • @QAQuest - “移除了 O 0,I 1。”什么?
          【解决方案7】:

          你可以在php rand手册中找到很多函数
          http://php.net/manual/en/function.rand.php

          我喜欢这个

             <?php
          //To Pull 8 Unique Random Values Out Of AlphaNumeric
          
          //removed number 0, capital o, number 1 and small L
          //Total: keys = 32, elements = 33
          $characters = array(
          "A","B","C","D","E","F","G","H","J","K","L","M",
          "N","P","Q","R","S","T","U","V","W","X","Y","Z",
          "1","2","3","4","5","6","7","8","9");
          
          //make an "empty container" or array for our keys
          $keys = array();
          
          //first count of $keys is empty so "1", remaining count is 1-7 = total 8 times
          while(count($keys) < 8) {
              //"0" because we use this to FIND ARRAY KEYS which has a 0 value
              //"-1" because were only concerned of number of keys which is 32 not 33
              //count($characters) = 33
              $x = mt_rand(0, count($characters)-1);
              if(!in_array($x, $keys)) {
                 $keys[] = $x;
              }
          }
          
          foreach($keys as $key){
             $random_chars .= $characters[$key];
          }
          echo $random_chars;
          ?>
          

          【讨论】:

            【解决方案8】:
            function generateCouponCode($length = 8) {
              $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
              $ret = '';
              for($i = 0; $i < $length; ++$i) {
                $random = str_shuffle($chars);
                $ret .= $random[0];
              }
              return $ret;
            }
            

            【讨论】:

            • 你打乱整个字符串只是为了得到第一个元素?
            【解决方案9】:

            试试这个:

            substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 10)
            

            【讨论】:

            • @QAQuest:不,此代码将返回一个由十个随机字母数字字符组成的字符串。如果你想要大写,请使用strtoupper
            【解决方案10】:

            http://webarto.com/35/php-random-string-generator

            给你。

            function randr($j = 8){
            $string = "";
                for($i=0;$i < $j;$i++){
                    srand((double)microtime()*1234567);
                    $x = mt_rand(0,2);
                    switch($x){
                        case 0:$string.= chr(mt_rand(97,122));break;
                        case 1:$string.= chr(mt_rand(65,90));break;
                        case 2:$string.= chr(mt_rand(48,57));break;
                    }
                }
            return strtoupper($string); //to uppercase
            }
            

            【讨论】:

            • 稍作改动:switch($x){ case 0:$string.= chr(mt_rand(65,90));break;案例 1:$string.= chr(mt_rand(48,57));break; 10000 所用的时间,1.667200088501 秒
            • $x = mt_rand(0,2); > $x = mt_rand(0,1);因为 case 2 不存在,所以我添加了 strtoupper 以避免修改大写代码,以防他想使用小写:)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-01
            • 1970-01-01
            • 2014-11-26
            • 1970-01-01
            • 2012-01-03
            • 1970-01-01
            相关资源
            最近更新 更多