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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
Apr 23 PHP
destoon二次开发入门示例
Jun 20 PHP
PHP中调用SVN命令更新网站方法
Jan 07 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
PHP实现微信申请退款功能
Oct 01 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
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
php中上传文件的的解决方案
2018/09/25 PHP
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
解析vue中的$mount
2017/12/21 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
js中调用微信的扫描二维码功能的实现代码
2020/04/11 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
python中管道用法入门实例
2015/06/04 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
Python阶乘求和的代码详解
2020/02/14 Python
python logging设置level失败的解决方法
2020/02/19 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
写给女生的道歉信
2014/01/14 职场文书
生日宴会主持词
2014/03/20 职场文书
实习生评语
2014/04/26 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
运动会主持词大全
2015/07/02 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
canvas多重阴影发光效果实现
2021/04/20 Javascript