uuid生成方案

PS:开发中会遇到一些生成唯一uuid的工作,总结一下,分析出来

  1. php内置函数uniqid()

    生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID。由于生成唯一ID与微秒时间关联,因此ID的唯一性非常可靠。
    生成的唯一ID默认返回的字符串有 13 个字符串长,如果不定义唯一ID的前缀,最多可返回23个字符串长,如果再结合md5()函数,生成的唯一ID可靠性将更高,这种生成的ID比随机性的ID最大优点在于可实现排序,特别是一些需要存储在数据库中的值。

    1. 函数原型

                      string uniqid ( [string prefix [, bool more_entropy]] )
                      ##参数
                      # prefix 有用的参数。例如:如果在多台主机上可能在同一微秒生成唯一ID。
                      # prefix为空,则返回的字符串长度为13。more_entropy 为 TRUE,则返回的字符串长度为23。
                      # more_entropy 如果设置为 TRUE,uniqid() 会在返回的字符串结尾增加额外的煽(使用combined linear congruential generator)。 使得唯一ID更具唯一性。
                      

      优点:uniqid()函数生成唯一ID之间具有可排序性的,既能用于生成临时性ID也能用于生成永久性唯一ID(存储数据库)

    2. uniqid() 生成不重复唯一标识方法一

      这种方法会产生重复数据,运行如下PHP代码会数组索引是产生的唯一标识,对应的元素值是该唯一标识重复的次数。

                      $v) {
                          if($v == 1) unset($uuids[$k]);
                      }
                      print_r($uuids);
                      ?>
                      
    3. uniqid() 生成不重复唯一标识方法二

      这种方法生成的唯一标识重复量明显减少。

                      $v) {
                          if($v == 1) unset($uuids[$k]);
                      }
                      print_r($uuids);
                      ?>
                      
    4. PHP uniqid() 生成不重复唯一标识方法三

      这种方法生成的唯一标识中没有重复。

                      $v) {
                          if($v == 1) unset($uuids[$k]);
                      }
                      print_r($uuids);
                      ?>
                      
  2. 自定义方法 create_guid()

    结果类似:{E2DFFFB3-571E-6CFC-4B5C-9FEDAAF2EFD7}

                function create_guid($namespace = '') {
                    static $guid = '';
                    $uid = uniqid("", true);
                    $data = $namespace;
                    $data .= $_SERVER['REQUEST_TIME'];
                    $data .= $_SERVER['HTTP_USER_AGENT'];
                    $data .= $_SERVER['LOCAL_ADDR'];
                    $data .= $_SERVER['LOCAL_PORT'];
                    $data .= $_SERVER['REMOTE_ADDR'];
                    $data .= $_SERVER['REMOTE_PORT'];
                    $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
                    $guid = '{' .
                      substr($hash, 0, 8) .
                      '-' .
                      substr($hash, 8, 4) .
                      '-' .
                      substr($hash, 12, 4) .
                      '-' .
                      substr($hash, 16, 4) .
                      '-' .
                      substr($hash, 20, 12) .
                      '}';
                    return $guid;
                }
            
  3. 通过数据库生成

            CREATE TABLE `uniqid` (
              `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'uniqid',
              `time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
              PRIMARY KEY (`id`)
            ) ENGINE=MyISAM AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8;
            

    给MySQL数据库中的表的id一个AUTO_INCREMENT(自增)属性,每次插入一条数据时,id自动+1,然后使用mysql_insert_id()或LAST_INSERT_ID()返回这个自增后的id

  4. 相关开源项目参考

    1. https://github.com/lootils/uuid
    2. https://github.com/ramsey/uuid
相关文章
  1. $_GET,$_POST与urldecode的使用风险
  2. yii2框架的错误处理
  3. Yii2过滤器-behaviors()行为调用
  4. 密码保护:PHP多进程编程
  5. 全排列算法原理和实现
  6. PHP静态方法和非静态方法的使用场景
本站版权
1、本站所有主题由该文章作者发表,该文章作者与尘埃享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和尘埃的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:
二维码
Posted in php, 位运算, 编程语言
Comments are closed.