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 相关文章推荐
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
Dec 06 PHP
Dedecms常用函数解析
Feb 01 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
PHP 实用代码收集
Jan 22 PHP
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
php分页查询mysql结果的base64处理方法示例
May 18 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
详解PHP文件的自动加载(autoloading)
Feb 04 PHP
php报错502badgateway解决方法
Oct 11 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
Javascript var变量隐式声明方法
2009/10/19 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python中类的属性和方法介绍
2018/11/27 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
pytorch中index_select()的用法详解
2021/01/06 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
资产评估专业大学生求职信
2013/09/29 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
react合成事件与原生事件的相关理解
2021/05/13 Javascript
JavaScript流程控制(分支)
2021/12/06 Javascript