首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend Framework生成唯一字符串

Zend Framework生成唯一字符串
EN

Stack Overflow用户
提问于 2011-09-18 05:07:05
回答 1查看 5.7K关注 0票数 5

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-18 06:28:51

使用给定的信息:

  • id必须是唯一的
  • id不能是数字
  • id不能表示序列
  • id将不会由用户输入<

>F29

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

** 编辑 **

是的,uniqid将返回一个无缝的序列号,但我们可以很容易地绕过这一点。请考虑下面的代码

代码语言:javascript
复制
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();

这将给出如下结果

代码语言:javascript
复制
ivpa493xrx7
d173barerui
evpoiyjdryd
99ej19mnau2

由于没有添加或修改任何内容,除了打乱比特之外,不应该有任何重复的值,并且所有内容看起来都是随机的。瞧!

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

我更新了这段代码,因为它最初发布的时间。你可以找到修订版的here

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7457802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档