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 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
PHP include_path设置技巧分享
Jul 03 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
php实现微信扫码支付
Mar 26 PHP
php实现简单的权限管理的示例代码
Aug 25 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
PHP读取目录树的实现方法分析
Mar 22 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 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
网站当前的在线人数
2006/10/09 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
PHP中文汉字验证码
2007/04/08 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
海飞丝广告词
2014/03/20 职场文书
未中标通知书
2015/04/17 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫