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 观察者模式的实现代码
May 10 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
php输出xml必须header的解决方法
Oct 17 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
PHP导入导出Excel代码
Jul 07 PHP
php基本函数汇总
Jul 09 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
利用php获得flv视频长度的实例代码
Oct 26 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
js 目录列举函数
2008/11/06 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
python如何读写csv数据
2018/03/21 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
python MD5加密的示例
2020/10/19 Python
Python LMDB库的使用示例
2021/02/14 Python
退伍老兵事迹材料
2014/01/31 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
中学生家长评语大全
2014/04/16 职场文书
会计专业求职信
2014/08/10 职场文书
教师业务学习材料
2014/12/16 职场文书
前台接待岗位职责
2015/02/03 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
解决Redis启动警告问题
2022/02/24 Redis