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 编程请选择正确的文本编辑软件
Dec 21 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
ThinkPHP的I方法使用详解
Jun 18 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
PHP文件操作实例总结
Sep 27 PHP
php7新特性的理解和比较总结
Apr 14 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
May 14 PHP
PHP中的异常处理机制深入讲解
Nov 10 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 include_path设置技巧分享
2011/07/03 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JavaScript 基础问答三
2008/12/03 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
Python中字符串的常见操作技巧总结
2016/07/28 Python
python脚本替换指定行实现步骤
2017/07/11 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
Python中itertools的用法详解
2020/02/07 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
Keras自定义IOU方式
2020/06/10 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
在人间读书笔记
2015/06/30 职场文书