==概念==
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
是否能更改为整型做主键