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横向重复区域显示二法
Sep 25 PHP
php中全局变量global的使用演示代码
May 18 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
May 16 PHP
很让人受教的 提高php代码质量36计
Sep 05 PHP
PHP json_encode中文乱码问题的解决办法
Sep 09 PHP
PHP中使用addslashes函数转义的安全性原理分析
Nov 03 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
Mar 05 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
PHP的简单跳转提示的实现详解
Mar 14 PHP
php装饰者模式简单应用案例分析
Oct 23 PHP
PHP大文件分割分片上传实现代码
Dec 09 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/03 咖啡文化
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
PHP中常用的转义函数
2014/02/28 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
Symfony的安装和配置方法
2016/03/17 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
个人委托书格式
2014/04/04 职场文书
个人安全承诺书
2014/05/22 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
新郎结婚保证书
2015/02/26 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
2016新年问候语大全
2015/11/11 职场文书