`
unsoundboy
  • 浏览: 62494 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
阅读更多
那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。

如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:

mysql> select uuid();
+--------------------------------------+
| uuid()                               |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+


现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。

优点:

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

缺点:

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

下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨。至于说使用UUID后,URL 显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词,仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下面这个形式的:/order.php/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现 URL是/order.php/id/1000,晚上再下一个订单发现URL是/order.php/id/2000,那么我就可以估计出此网站一天的订单数大致是1000左右,甚至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。

效率?

如果上面说的UUID的所谓缺点都不成立的话,那么是否使用UUID做主键,唯一的问题就是效率了。据说在PostgreSQL等数据库里,都有专门的 UUID类型,在这样的数据库里,使用UUID做主键,效率没有任何问题,可惜在MySQL里没有这样的字段,如果想在MySQL里保存UUID做主键,一般是使用CHAR(36)来模拟,因为不是一个原生的UUID类型,所以主键的效率到底如何有待测试,另外,UUID做主键的效率和UUID本身的算法实现也有很大关系。

我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。

至于在MySQL上使用UUID(用char(36)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!!

如何生成UUID?下面这种方法生成的貌似不是UUID,因为MD5实际上是可能存在重复值的(参考http://www.phpx.com /happy/archiver/tid-56636.html),况且使用随机更不能避免存在重复.所以应直接使用mysql中的uuid函数生成

function uuid($prefix = '')

     {

     $chars = md5(uniqid(mt_rand(), true));

     $uuid     = substr($chars,0,8) . '-';

     $uuid .= substr($chars,8,4) . '-';

     $uuid .= substr($chars,12,4) . '-';

     $uuid .= substr($chars,16,4) . '-';

     $uuid .= substr($chars,20,12);

     return $prefix . $uuid;

     }

在mysql中插入uuid使用mysql的uuid()函数

INSERT INTO Table(id,..) VALUES( UUID(), ...)

当然也可以用 SELECT UUID() 先得到一个uuid值再插入进去

题外:

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

相关推荐

    uuid生成16位的,唯一码

    uuid生成,可生成16个字符的唯一码。使用方法,见main函数

    uuid.rar_C获得UUID_UUID C_c生成uuid_c语言生成uuid_uuid

    标题“uuid.rar_C获得UUID_UUID C_c生成uuid_c语言生成uuid_uuid”表明这是一个关于使用C语言实现UUID生成的资源包。这个压缩包可能包含了一个C语言编写的程序或库,可以用来在Windows平台上(通过VC6编译器)生成...

    UUID生成器

    UUID生成器就是这样一个工具,能够自动生成这种具有唯一性的标识符。 标题中的"UUID生成器"是一个应用程序,它设计的目标是简洁易用,用户无需关心具体实现,只需解压缩后即可运行。由于已包含jre(Java Runtime ...

    32位UUID生成工具,16进制

    32位UUID生成工具,正如标题所描述的,是一种专门用来生成32个16进制数字组成的唯一标识的程序。尽管128位的UUID标准形式由32个十六进制数字组成,这里提到的"32位"可能是指显示或输入时使用的简化形式,即用户仅...

    唯一uuidid生成器

    描述中提到的“全局唯一的id,更具ip加地址时间戳等生成的唯一性id”,这可能是指一种特定的UUID生成策略,它结合了IP地址、时间戳和其他可能的信息来进一步确保ID的独特性。这样的方法可以增强ID的可追踪性和意义,...

    uuid 生成器 UUID_GEN.exe

    UUID GEN.exe 是一个基于Java编写的UUID生成器工具,主要用于生成这些具有唯一性的128位数字或字符串。在Java中,UUID是通过java.util.UUID类来生成和操作的。 UUID由16个字节组成,通常用16进制表示,分为5个部分...

    嵌入式Linux UUID生成代码接口及测试程序

    嵌入式系统中,由于资源限制,可能无法依赖于完整的libuuid库,因此,开发者可能需要编写自己的UUID生成代码。这通常涉及到以下几个关键步骤: 1. **获取当前时间戳**:使用`gettimeofday()`函数获取当前的时间戳,...

    UUID生成工具类

    UUID生成工具类

    uuid生成工具类

    有序UUID生成器 借鉴hibernate的UUID生成器 CustomVersionOneStrategy。

    JAVA UUID 生成.txt

    ### JAVA UUID 生成知识点 #### 一、UUID 概述 - **定义**: UUID (Universally Unique Identifier) 即全局唯一标识符,是一种用于在分布式系统中唯一标识信息的方法。 - **长度**: UUID 的标准形式为 128 位(16 ...

    UUID生成UUIDs的库

    - `ramsey/uuid` 库还提供了针对特定平台的优化,例如对于能提供硬件随机数的系统,Version 4的UUID生成速度会更快。 7. **扩展性**: - 库支持自定义生成器(Generator)和解析器(Decoder),允许用户根据需求...

    c 代码的UUID生成源码

    这两种算法在UUID生成中可能被用作增加随机性和唯一性的手段,例如通过计算特定数据(如时间戳、随机数等)的哈希值来创建UUID的一部分。 为了实现UUID,开发者通常会结合以下步骤: 1. **获取当前时间戳**:以...

    UUID生成模块源码,支持版本1,3,4,5

    UUID,全称Universally Unique Identifier,是用于唯一标识信息的128...`content.txt`文件可能包含了关于UUID生成模块的源代码,通过阅读和理解这些代码,我们可以深入学习UUID的实现细节,并在自己的项目中灵活应用。

    uuid 生成不重复ID3万个

    uuid 生成不重复ID3万个 检测到重复就重试生成,把生成的id好,写入txt文档中

    JAVA UUID 生成全球唯一ID

    GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复

    一款 Go 语言开发的 UUID 生成服务.zip

    在Go语言中,开发UUID生成服务是一项常见的任务,特别是在分布式系统、数据库记录、网络通信等领域,UUID能够确保不同节点之间产生的ID不会冲突。Go语言的标准库`github.com/google/uuid`提供了方便的接口来生成和...

    UUIDGenerator:使用C ++ 11的简单UUID生成器

    一个使用C ++ 11的简单UUID生成器。 该程序是使用C ++ 11的简单128位UUID生成器。 请注意,这不是符合RFC4122的UUID。 有关符合RFC4122的UUID的更多信息,请参考 。 如果您正在寻找兼容RFC4122的UUID,请尝试或从...

    uuid生成器

    UUID,全称Universally Unique...综上所述,UUID生成器是一个便捷的工具,用于快速、简单地获取UUID,广泛应用于各种IT场景,以保证数据的唯一性和不可预测性。了解UUID的生成原理和特性,对于开发者来说是非常必要的。

    Go-Guuid是一款由Go语言开发的UUID生成服务.

    **Go-Guuid:Go语言实现的UUID生成器详解** UUID(Universally Unique Identifier)是一种用于唯一标识信息的128位数字,广泛应用于分布式系统、数据库、网络编程等多个领域。在Go语言中,开发人员经常需要生成UUID...

    GBK编码-文件名按UUID生成的ckfinder的Jar包-青软培训

    【UUID生成新文件名】UUID(Universally Unique Identifier)是一种保证全球唯一性的标识符。在CKFinder中,使用UUID生成新文件名可以避免文件上传时因同名文件导致的覆盖或冲突问题。UUID具有极低的重复概率,因此...

Global site tag (gtag.js) - Google Analytics