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中使用Oracle数据库(5)
Oct 09 PHP
第五章 php数组操作
Dec 30 PHP
php断点续传之如何分割合并文件
Mar 22 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
查找php配置文件php.ini所在路径的二种方法
May 26 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
PHP计算加权平均数的方法
Jul 16 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
微信公众号OAuth2.0网页授权问题浅析
Jan 21 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 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定时更新程序设计思路分享
2014/06/10 PHP
php自定文件保存session的方法
2014/12/10 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
python文本数据相似度的度量
2018/03/12 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
入党申请书自我鉴定
2013/10/12 职场文书
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
魅力教师事迹材料
2014/01/10 职场文书
考试退步检讨书
2014/01/15 职场文书
迅雷Cued工作心得体会
2014/01/27 职场文书
铲车司机岗位职责
2014/03/15 职场文书
工会主席事迹材料
2014/06/03 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
2014年人大工作总结
2014/12/10 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
Java 在线考试云平台的实现
2021/11/23 Java/Android
css样式important规则的正确使用方式
2022/06/10 HTML / CSS