唯一主键的第二选择---UUID

本文详细介绍了UUID的概念、组成及生成方法,并提供了PHP和SQL示例代码。探讨了UUID作为主键的优缺点,包括独立性、存储空间占用及URL长度等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

==概念==
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的重要部分。

==组成==
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字
UUID由以下几部分的组合:
(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

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-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。

==PHP生成UUID==
<pre>
1. /**
2.   * Generates an UUID
3.   *
4.   * @author     Anis uddin Ahmad  
5.   * @param      string  an optional prefix
6.   * @return     string  the formatted uuid
7.   */  
8.   function uuid($prefix = '')  
9.   {  
10.     $chars = md5(uniqid(mt_rand(), true));  
11.     $uuid  = substr($chars,0,8) . '-';  
12.     $uuid .= substr($chars,8,4) . '-';  
13.     $uuid .= substr($chars,12,4) . '-';  
14.     $uuid .= substr($chars,16,4) . '-';  
15.     $uuid .= substr($chars,20,12);  
16.     return $prefix . $uuid;  
17.   }    
18.    
19. //Example of using the function -  
20. //Using without prefix.  
21. echo uuid(); //Returns like ‘1225c695-cfb8-4ebb-aaaa-80da344e8352′     
22.    
23. //Using with prefix  
24. echo uuid(‘urn:uuid:’);//Returns like ‘urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344e8352′  
</pre>


==SQL生成UUID==
insert into `activation_codes` ( `activation_codes`.`activation_code`) values(uuid());

如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:
<pre>
mysql> select uuid();
+--------------------------------------+
| uuid()                               |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+
</pre>
==总结==

我们来看看UUID的优缺点分别是什么。

*优点:

#能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
#保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

*缺点:

#比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
#使用UUID后,URL显得冗长,不够友好。

*效率

如果上面说的UUID的所谓缺点都不成立的话,那么是否使用UUID做主键,唯一的问题就是效率了。据说在PostgreSQL等数据库里,都有专门的 UUID类型,在这样的数据库里,使用UUID做主键,效率没有任何问题,可惜在MySQL里没有这样的字段,如果想在MySQL里保存UUID做主键, 一般是使用CHAR(36)来模拟,因为不是一个原生的UUID类型,所以主键的效率到底如何有待测试。但是据认识人讲阿里大神是用UUID的-_-

==题外==

可能相比较使用整型做主键,效率稍差,
另外一个问题是可能导致URL太长,比如显示某个id下的分类时
通常这样category.php?cid=2 但是现在可能是category.php?uuid=a93f16c5-9634-102c-824f-3ea0651c5b77
是否能更改为整型做主键

 

转载于:https://my.oschina.net/jlong/blog/1538026

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值