php生成唯一数字id的方法汇总


Posted in PHP onNovember 18, 2015

关于生成唯一数字ID的问题,是不是需要使用rand生成一个随机数,然后去数据库查询是否有这个数呢?感觉这样的话有点费时间,有没有其他方法呢?

当然不是,其实有两种方法可以解决。

1. 如果你只用php而不用数据库的话,那时间戳+随机数是最好的方法,且不重复;

2. 如果需要使用数据库,即你还需要给这个id关联一些其他的数据。那就给MySQL数据库中的表的id一个AUTO_INCREMENT(自增)属性,每次插入一条数据时,id自动+1,然后使用mysql_insert_id()或LAST_INSERT_ID()返回这个自增后的id。

当然,这个问题已经有现成的解决方法了,使用php uuid扩展就能完美解决这个问题,这个扩展能生成唯一的完全数字签名。。

如果你不使用composer请参考https://github.com/lootils/uuid,

如果你的项目是基于composer搭建的,那么请参考https://github.com/ramsey/uuid

具体的源码我就不搬运了,小伙伴们自己取下来就可以直接使用了

PHP生成唯一标识符代码示例:

< ? 
//生成唯一标识符  
//sha1()函数, "安全散列算法(SHA1)"  
function create_unique() {  
$data = $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']  
.time() . rand();  
return sha1($data);  
//return md5(time().$data);  
//return $data;  
} 
?>

PHP生成唯一标识符函数描述及例子

< ?  
$newhash = create_unique();  
echo $newhash;  
?>

再给大家分享一个

/*
 * 信号量(Semaphore)。
 * 这是一个包装类,用于解决不同平台下对“信号量”的不同实现方式。
 * 目前这个类只是象征性的,在 Windows 平台下实际是空跑(并没有真的实现互斥)。
 */
class SemWrapper
{
  private $hasSemSupport;
  private $sem;
  const SEM_KEY = 1;

  public function __construct()
  {
    $this->hasSemSupport = function_exists( 'sem_get' );
    if ( $this->hasSemSupport ) {
      $this->sem = sem_get( self::SEM_KEY );
    }
  }

  public function acquire() {
    if ( $this->hasSemSupport ) {
      return sem_acquire( $this->sem );
    }
    return true;
  }

  public function release() {
    if ( $this->hasSemSupport ) {
      return sem_release( $this->sem );
    }
    return true;
  }
}

/*
 * 顺序号发生器。
 */
class SeqGenerator
{
  const SHM_KEY = 1;

  /**
   * 对顺序号发生器进行初始化。
   * 仅在服务器启动后的第一次调用有效,此后再调用此方法没有实际作用。
   * @param int $start 产生顺序号的起始值。
   * @return boolean 返回 true 表示成功。
   */
  static public function init( $start = 1 )
  {
    // 通过信号量实现互斥,避免对共享内存的访问冲突
    $sw = new SemWrapper;
    if ( ! $sw->acquire() ) {
      return false;
    }

    // 打开共享内存
    $shm_id = shmop_open( self::SHM_KEY, 'n', 0644, 4 );
    if ( empty($shm_id) ) {
      // 因使用了 'n' 模式,如果无法打开共享内存,可以认为该共享内存已经创建,无需再次初始化
      $sw->release();
      return true;
    }

    // 在共享内存中写入初始值
    $size = shmop_write( $shm_id, pack( 'L', $start ), 0 );
    if ( $size != 4 ) {
      shmop_close( $shm_id );
      $sw->release();
      return false;
    }

    // 关闭共享内存,释放信号量
    shmop_close( $shm_id );
    $sw->release();
    return true;
  }

  /**
   * 产生下一个顺序号。
   * @return int 产生的顺序号
   */
  static public function next()
  {
    // 通过信号量实现互斥,避免对共享内存的访问冲突
    $sw = new SemWrapper;
    if ( ! $sw->acquire() ) {
      return 0;
    }

    // 打开共享内存
    $shm_id = shmop_open( self::SHM_KEY, 'w', 0, 0 );
    if ( empty($shm_id) ) {
      $sw->release();
      return 0;
    }

    // 从共享内存中读出顺序号
    $data = shmop_read( $shm_id, 0, 4 );
    if ( empty($data) ) {
      $sw->release();
      return 0;
    }

    $arr = unpack( 'L', $data );
    $seq = $arr[1];

    // 把下一个顺序号写入共享内存
    $size = shmop_write( $shm_id, pack( 'L', $seq + 1 ), 0 );
    if ( $size != 4 ) {
      $sw->release();
      return 0;
    }

    // 关闭共享内存,释放信号量
    shmop_close( $shm_id );
    $sw->release();
    return $seq;
  }
}

$a = SeqGenerator::init( time() );
var_dump($a);

for ( $i=0; $i < 10; $i++ ) {
  $seq = SeqGenerator::next();
  var_dump($seq);
}

好了,今天就先到这里吧,希望对大家学习PHP能够有所帮助

PHP 相关文章推荐
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
PHP入门学习的几个不错的实例代码
Jul 13 PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
Apr 25 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
php输出全球各个时区列表的方法
Mar 31 PHP
PHP6新特性分析
Mar 03 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
Jun 19 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 #PHP
使用PHP uniqid函数生成唯一ID
Nov 18 #PHP
使用PHP实现生成HTML静态页面
Nov 18 #PHP
php+ajax无刷新上传图片实例代码
Nov 17 #PHP
php计算年龄精准到年月日
Nov 17 #PHP
php实现简单的上传进度条
Nov 17 #PHP
PHP安装threads多线程扩展基础教程
Nov 17 #PHP
You might like
一个ftp类(ini.php)
2006/10/09 PHP
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
php代码架构的八点注意事项
2016/01/25 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
JavaScript 乱码问题
2009/08/06 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
package.json文件配置详解
2017/06/15 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
vue + axios get下载文件功能
2019/09/25 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
Python基于DES算法加密解密实例
2015/06/03 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
深入理解Python对Json的解析
2017/02/14 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
如何设置Java的运行环境
2013/04/05 面试题
历史系自荐信范文
2013/12/24 职场文书
暑期实践思想汇报
2014/01/06 职场文书
老师对学生的评语
2014/04/18 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
小学运动会报道稿
2014/10/04 职场文书
优秀员工自荐书
2015/03/06 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
MySQL中一条update语句是如何执行的
2022/03/16 MySQL
Golang jwt身份认证
2022/04/20 Golang
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript