Zend Framework生成唯一的字符串

时间:2011-09-17 21:07:05

标签: php zend-framework unique zend-db

我想生成一个唯一的4-6字符长的AlphaNumeric字符串,以便在db中保存每条记录(用户)。 db字段具有唯一索引,因此尝试保存预先存在的字符串会生成错误。现在我生成一个随机字符串并使用try-catch,所以当添加新记录时如果它抛出异常,我生成另一个随机字符串并尝试再次保存,代码继续尝试,直到它成功添加记录。这整个解决方案不仅看起来很重,而且很难看,所以我想改变它。我对优雅的解决方案感兴趣,所以欢迎任何帮助/指导。

1 个答案:

答案 0 :(得分:6)

根据给定的信息:

  • id必须是唯一的
  • id不得为数字
  • id不得代表顺序系列
  • id不会被用户输入

PHP函数uniqid正是您所需要的。虽然它返回一个13个字符长的十六进制值。


** 修改 **

是的,uniqid将返回一个接缝序列号,但我们可以轻松解决这个问题。考虑一下这段代码

class IDGenerator {
   //const BIT_MASK = '01110011';

   static public function generate() {

      $id = uniqid();

      $id = base_convert($id, 16, 2);
      $id = str_pad($id, strlen($id) + (8 - (strlen($id) % 8)), '0', STR_PAD_LEFT);

      $chunks = str_split($id, 8);
      //$mask = (int) base_convert(IDGenerator::BIT_MASK, 2, 10);

      $id = array();
      foreach ($chunks as $key => $chunk) {
         //$chunk = str_pad(base_convert(base_convert($chunk, 2, 10) ^ $mask, 10, 2), 8, '0', STR_PAD_LEFT);
         if ($key & 1) {  // odd
            array_unshift($id, $chunk);
         } else {         // even
            array_push($id, $chunk);
         }
      }

      return base_convert(implode($id), 2, 36);
   }
}

echo IDGenerator::generate();

会产生类似

的结果
ivpa493xrx7
d173barerui
evpoiyjdryd
99ej19mnau2

由于没有添加或修改任何内容,除了改变位之外,不应该有任何重复的值,一切似乎是随机的。瞧!

**更新(2014-02-24)**

我从最初发布的时间开始更新这段代码。您可以找到修订版here