目录
一、生成唯一uuid
从代码中可以看出,通过unique生成一个以毫秒级时间戳为前缀的字符后md5加密
再通过分隔符进行分割后得到uuid
这种方式虽然极大程度的避免了uid的重复
但是生成的uid太长,足足36个字符,而且是混杂英文和数字符号的,可读性很差
而一般的uid中都是纯数值组成的
1
2
3
4
5
6
7
8
9
10
|
<?php
function generateUUid( $strtoupper = false)
{
$charid = call_user_func( $strtoupper ? 'strtoupper' : 'strtolower' , md5(uniqid(microtime(true), true)));
$hyphen = chr (45);
$uuid = substr ( $charid , 0, 8) . $hyphen . substr ( $charid , 8, 4) . $hyphen . substr ( $charid , 12, 4) . $hyphen . substr ( $charid , 16, 4) . $hyphen . substr ( $charid , 20, 12);
return $uuid ;
}
//结果:37f14a07-cb18-2e54-4e40-da1e2fa0456d
|
二、生成唯一uid
由于一般正常的uid都是纯数值型的
而要保证唯一性,必然要跟时间戳有关系,因此有了以下代码
为了尽可能的在同一秒中注册人数的uid不同,将时间戳进行打乱随机排序,也不失为一个好办法
但是这种缺点就是,uid长度是固定的,无法进行改变,虽然呢,打乱字符是一个很好的解决重复的方式
但是事情无绝对,如果真的因为随机碰撞导致的uid相同该如何
为了更保险起见,必然还是要走一次数据库的查询
大大增加了数据库的I/O压力
1
2
3
4
5
6
7
|
<?php
function generateUid()
{
return call_user_func( 'str_shuffle' , time());
}
//结果:4067524162
|
三、生成唯一uid的正确方法
虽然说上面的两种方式并非不可取
但是在大型公司必然不可取,一种是uid的格式必然纯数值,所以uuid方式可以排除
另外由于对数据库的压力起见,必然也不会采用第二种方式
而最经常采用的方式应该是使用数据库的主键索引,因为主键索引必然唯一
这里很多人会疑惑,主键索引不是会从1开始吗,这uid会有1位数的?
小了,格局小了,你可以设置主键索引的offset,让他从100000开始,不就可以解决这个问题了吗
这时候有人又问,那主键索引增加不是有规律的吗,比如插一条,会自增1
这时候就可以设置主键索引的增长步长,让他插入一条的步长不为1即可
而为了让uid看起来更加没有关联性,你可以设置步长为基数,比如3
这样增长起来,就会是100000,100003,100006,100009,100012….
补充
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
通常平台 会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。
由以 下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相 同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。
关于 UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。
在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx-xxxx- xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。
而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php
function guid(){
if (function_exists( 'com_create_guid' )){
return com_create_guid();
} else {
mt_srand((double)microtime()*10000); //optional for php 4.2.0 and up.
$charid = strtoupper (md5(uniqid(rand(), true)));
$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 ;
}
}
echo guid();
?>
|
到此这篇关于php生成唯一uid的解决方法详解的文章就介绍到这了,更多相关php内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!
原文链接:https://autofelix.blog.csdn.net/article/details/118036252
相关文章
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-27 19
-
ubuntu 16.04 LTS 安装mongodb 3.2.8教程
2025-05-27 99 -
2025-05-27 35
-
2025-05-25 100
-
2025-05-29 22