使用PHP uniqid函数生成唯一ID


Posted in PHP onNovember 18, 2015

生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID。由于生成唯一ID与微秒时间关联,因此ID的唯一性非常可靠。

生成的唯一ID默认返回的字符串有 13 个字符串长,如果不定义唯一ID的前缀,最多可返回23个字符串长,如果再结合md5()函数,生成的唯一ID可靠性将更高,这种生成的ID比随机性的ID 最大优点在于可实现排序,特别是一些需要存储在数据库中的值。

一,函数原型

string uniqid ( [string prefix [, bool more_entropy]] )

可定义唯一ID的前缀与长度

二,版本兼容

PHP 3, PHP 4, PHP 5

三,函数基础用法与实例

1,生成一个唯一ID

<?php 
echo uniqid(); 
?>

2,结合md5()函数生成一个唯一ID

<?php 
echo md5(uniqid()); 
?>

输出:dfbc5c8c6438de075da28b3c8a413fd0

3,生成多个唯一ID,由于是以微秒计

<?php 
echo uniqid(); 
echo uniqid(); 
echo uniqid(); 
?>

输出:

4bfd0e375396b
4bfd0e3753981
4bfd0e3753983

由生成的结果来看,唯一ID之间具有可排序性的。
使用uniqid()函数生成唯一ID既能用于生成临时性ID也能用于生成永久性唯一ID(存储数据库)。

ps:php 生成唯一id的几种解决方法

下面小编给大家整理了三种解决办法,具体内容如下:

1、md5(time() . mt_rand(1,1000000));

这种方法有一定的概率会出现重复

2、php内置函数uniqid()

uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.

w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数"。

下面方法返回结果类似:5DDB650F-4389-F4A9-A100-501EF1348872

function uuid() {
  if (function_exists ( 'com_create_guid' )) {
    return com_create_guid ();
  } else {
    mt_srand ( ( double ) microtime () * 10000 ); //optional for php 4.2.0 and up.随便数播种,4.2.0以后不需要了。
    $charid = strtoupper ( md5 ( uniqid ( rand (), true ) ) ); //根据当前时间(微秒计)生成唯一id.
    $hyphen = chr ( 45 ); // "-"
    $uuid = '' . //chr(123)// "{"
substr ( $charid, 0, 8 ) . $hyphen . substr ( $charid, 8, 4 ) . $hyphen . substr ( $charid, 12, 4 ) . $hyphen . substr ( $charid, 16, 4 ) . $hyphen . substr ( $charid, 20, 12 );
    //.chr(125);// "}"
    return $uuid;
  }
}

com_create_guid()是php自带的生成唯一id方法,php5之后貌似已经没有了。

3、官方uniqid()参考手册有用户提供的方法,结果类似:{E2DFFFB3-571E-6CFC-4B5C-9FEDAAF2EFD7}

public function create_guid($namespace = '') {  
  static $guid = '';
  $uid = uniqid("", true);
  $data = $namespace;
  $data .= $_SERVER['REQUEST_TIME'];
  $data .= $_SERVER['HTTP_USER_AGENT'];
  $data .= $_SERVER['LOCAL_ADDR'];
  $data .= $_SERVER['LOCAL_PORT'];
  $data .= $_SERVER['REMOTE_ADDR'];
  $data .= $_SERVER['REMOTE_PORT'];
  $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
  $guid = '{' . 
      substr($hash, 0, 8) .
      '-' .
      substr($hash, 8, 4) .
      '-' .
      substr($hash, 12, 4) .
      '-' .
      substr($hash, 16, 4) .
      '-' .
      substr($hash, 20, 12) .
      '}';
  return $guid;
 }
PHP 相关文章推荐
PHP中Session的概念
Oct 09 PHP
PHP与SQL注入攻击[三]
Apr 17 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
Dec 12 PHP
一些需要禁用的PHP危险函数(disable_functions)
Feb 23 PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 PHP
php实现两个数组相加的方法
Feb 17 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
Nov 23 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP中危险的file_put_contents函数详解
Nov 04 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 05 PHP
php中数组最简单的使用方法
Dec 27 PHP
使用PHP实现生成HTML静态页面
Nov 18 #PHP
php+ajax无刷新上传图片实例代码
Nov 17 #PHP
php计算年龄精准到年月日
Nov 17 #PHP
php实现简单的上传进度条
Nov 17 #PHP
PHP安装threads多线程扩展基础教程
Nov 17 #PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 #PHP
教大家制作简单的php日历
Nov 17 #PHP
You might like
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
python实现无边框进度条的实例代码
2020/12/30 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
会计毕业生自荐信
2013/11/21 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
绿化工程实施方案
2014/03/17 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
黄埔军校观后感
2015/06/10 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis