ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – Zend Framework生成唯一的字符串

2019-05-18 10:15:45  阅读:224  来源: 互联网

标签:php unique zend-framework zend-db


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

解决方法:

根据给定的信息:

> 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

标签:php,unique,zend-framework,zend-db
来源: https://codeday.me/bug/20190518/1127224.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有