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 相关文章推荐
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
PHP 类型转换函数intval
Jun 20 PHP
php 静态页面中显示动态内容
Aug 14 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
分析PHP中单双引号的误区和双引号小隐患
Jul 19 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
PHP实现随机发放扑克牌
Apr 21 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
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
详解解决小程序中webview页面多层history返回问题
2019/08/20 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
python实现折半查找和归并排序算法
2017/04/14 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
Python格式化输出%s和%d
2018/05/07 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
材料加工硕士生求职信
2013/10/10 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
楚门的世界观后感
2015/06/03 职场文书
同事去世追悼词
2015/06/23 职场文书
公司车辆管理制度
2015/08/04 职场文书