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中的cookie
Nov 26 PHP
PHP生成UTF8文件的方法
May 15 PHP
细谈php中SQL注入攻击与XSS攻击
Jun 10 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
php封装一个异常的处理类
Jun 08 PHP
PHP7数组的底层实现示例
Aug 25 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 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
CURL状态码列表(详细)
2013/06/27 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
两个DIV等高的JS的实现代码
2007/12/23 Javascript
捕获关闭窗口的脚本
2009/01/10 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
js function使用心得
2010/05/10 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
Python3基础之基本运算符概述
2014/08/13 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
Python之修改图片像素值的方法
2019/07/03 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
如何清空python的变量
2020/07/05 Python
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
员工自我鉴定
2013/10/09 职场文书
运动会广播稿20字
2014/02/18 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
施工安全汇报材料
2014/08/17 职场文书