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 相关文章推荐
深入了解php4(2)--重访过去
Oct 09 PHP
用PHP的ob_start();控制您的浏览器cache!
Feb 14 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
PHP 第三节 变量介绍
Apr 28 PHP
解析strtr函数的效率问题
Jun 26 PHP
php操作mysqli(示例代码)
Oct 28 PHP
php图片缩放实现方法
Feb 20 PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 PHP
通过php添加xml文档内容的方法
Jan 23 PHP
CodeIgniter针对数据库的连接、配置及使用方法
Mar 03 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP程序员编程注意事项
2008/04/10 PHP
php下删除字符串中HTML标签的函数
2008/08/27 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
Yii2 rbac权限控制操作步骤实例教程
2016/04/29 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
django将数组传递给前台模板的方法
2019/08/06 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
Python 中Operator模块的使用
2021/01/30 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
优秀员工自荐信范文
2013/10/05 职场文书
浪费资源的建议书
2014/03/12 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js