`
javababy1
  • 浏览: 1202057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于UUID,GUID,OCMB

阅读更多

UUID是是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier),指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。

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. GUID类型

GUID是Globally Unique IDentifier的缩写,是一个128位的随机数,并保证不产生重复。

4. COMB类型

COMB(combine)型可以理解为一种改进的GUID,它通过组合GUID和系统时间,以使其在索引和检索事有更优的性能。

下表列出四种主键生成方式优缺点的比较:

COMB类型主键生成实现:

主键生成策略

优点

缺点

自动增长字段

1. 使用简单

1. 不同数据库获取当前值方式不同;

2. 难以应用在多个数据库间进行数据迁移的情况。

手动增长型字段

1. 可以获得最新键值

2. 可以确保数据合并过程中不会出现键值冲突

1. 通常情况下需要建立一张单独的表存储当前主键键值;

2. 增加一次数据库访问来获取当前主键键值;

3. 考虑并发冲突等,增加系统的复杂程度。

使用GUID

1. 直接生成GUID,获得最新键值以填充主键,使用方便;

2. 可以确保数据合并过程中不会出现键值冲突;

3. 避免了前两种方式获取当前键值所增加的开销。

1. 占用较多存储空间;

2. 索引耗时;

3. 在多表链接查询时效率不如int

使用“COMB”类型

1. 保留GUID的已有优点;

2. 利用时间信息与GUID组合起来,增加有序性以提高索引效率。

1. 需要设计COMB的生成算法;

2. GUID一样占用较多存储空间;

3. 在多表链接查询时效率不如int型,但优于GUID

COMB数据类型的基本设计思路是这样的:既然GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么能不能通过组合的方式,保留GUID10个字节,用另6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与GUID组合起来,在保留GUID的唯一性的同时增加了有序性,以此来提高索引效率。

下面转自:温少,首发于博客园

替代方案之一,就是使用关系数据库的自增长字段,自增长字段的一个问题是,无法预先创建一个ID,只能够在保存的时候才能生成ID,这对于批量关联插入数据来说,不满足需求。

替代方案之二,就是使用一个记录ID的表,每次加一,在事务中使用Select FOR UPDATE来读取然后UPDATE SET FVALUE = FVALUE + 1,或者使用我之前文章中所提到的CAS算法。 这样做,会导致性能低下,每生成一个ID的成本都很高。

替代方案之三,就是把ID分成两部分,Seed和IncrementID。Seed采用上面的方案二或者其他办法生成,IncrementID使用一个AtomicInteger来每次递增生成。SEED转化为九进制数字,这样SEED就不会包含9,于是使用9作为分隔符,把SEED和IncrementID隔开。这样做,就可以做高性能产生ID,而且确保不重复。甚至可以更进一步,SEED由一个中心服务器生成。使用9个分隔符号隔开SEED和IncrementID,好处是SEED是变长,而不是使用固定位数来保存SEED,这样产生的ID会更短,可读性更好。

举例,34915,其中34时SEED,15是IncrementID,9是分隔符,SEED部分采用九进制表示法,确保不出现9,第一个9之后的内容属于IncrementID。

分享到:
评论

相关推荐

    COM开发中的uuid,GUID,CLSID,ProgID区别在哪儿.zip

    COM组件uuid,GUID,CLSID,ProgID区别在哪儿.zip

    vc MFC获得uuid或GUID

    CString CTestGetUUIDDlg::newGUID() { CString buf; GUID guid; if (S_OK == ::... , guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5] , guid.Data4[6], guid.Data4[7]); } return buf; }

    详解php中生成标准uuid(guid)的方法

    在介绍这个方法之前,首先需要理解UUID和GUID的概念以及它们的应用场景。 UUID(Universally Unique Identifier)是一种标准化的128位长度的全局唯一标识符,它可以保证在同一时间和空间范围内的所有生成的UUID都是...

    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(和 GUID)作为一等公民

    UUID(和 GUID)作为一流的 javascript 公民。 基于的内部实现和的公共接口。 目前仅支持 V4 UUID。 随机法 尝试使用最新的库加密级别库,如果没有其他可用的,则回退到 Math.random。 用法 实例化 var uuid = new...

    UUID.rar_UUID C_uuid

    UUID(Universally Unique Identifier)和GUID(Globally Unique Identifier)是计算机编程中用于标识唯一对象的128位数字。在Windows系统中,UUID和GUID通常被互换使用,尽管在技术上它们存在微小差异。UUID是开放...

    一段用VB生成GUID的代码

    ### VB生成GUID的相关知识点 #### 一、GUID简介 GUID(Globally Unique Identifier),即全局唯一标识符,是一种在时间和空间上具有唯一性的标识符。GUID常用于跨平台、跨语言的应用程序中,用来确保生成的数据...

    如何生成guid

    UUID guid = UUID.randomUUID(); System.out.println(guid.toString()); ``` 5. **PHP**: PHP中,可以使用`com_create_guid()`函数生成GUID: ```php $guid = com_create_guid(); echo $guid; ``` 6. **...

    UUID Maker

    一个GUID/UUID的生成工具。 提供GUID和UUID两张选择,提供GUID Style和Hex String两种输出选择。 <br>UUID是在GUID上做了更改生成的GUID字符串,通过将GUID的前6个字节替换为时间已做到使生成的GUID字符串有序...

    uuid.rar_uuid

    UUID(Universally Unique Identifier)和GUID(Globally Unique Identifier)是计算机编程中用于标识信息的128位数字。UUID和GUID实际上是一回事,它们遵循相同的规范,只是在不同的上下文中使用不同的名称。UUID...

    浅谈java获取UUID与UUID的校验

    关于 UUID 的校验,Java 提供了多种方法来实现。我们可以使用正则表达式来匹配 UUID 的格式,例如:^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$。 在上面的示例代码中,我们定义了一个 ...

    guid.zip_C# guid 算法_GUID 算法_guid 代码

    在IT行业中,`Guid`(全局唯一标识符,也称为UUID)是一种广泛使用的标识符,特别是在分布式系统和数据库中,因为它能确保在全球范围内生成的每个标识符都是唯一的。`Guid`由128位数字组成,通常以32位十六进制数的...

    GUID/UUID生成器

    一个很好用的GUID生成器,可以批量保存为TXT文件。

    GUID生成器,源码

    GUID,全称Globally Unique Identifier,是一种在分布式系统中用于唯一标识对象的128位数字。...以上就是关于GUID生成器的一些核心知识点。在实际开发中,了解和掌握这些内容将有助于你更有效地利用GUID进行程序设计。

    java代码生成GUID

    在Java编程语言中,生成全局唯一标识符(GUID,Globally Unique Identifier)通常涉及到使用UUID(Universally Unique Identifier)类。UUID是一个128位的数字,它以一种几乎可以确保全球范围内的唯一性的算法生成。...

    VB生成GUID程序示例源码

    在IT领域,尤其是在编程中,GUID(Globally Unique Identifier)是一种广泛使用的唯一标识符,由微软公司提出并在多种编程语言中支持,包括Visual Basic(VB)。GUID是128位的数字,通常以32个十六进制数的形式表示...

    获取Guid唯一码

    Python的标准库中没有直接提供生成Guid的函数,但可以借助`uuid`模块来创建一个UUID对象,它等同于Guid: ```python import uuid guid = uuid.uuid4() ``` 4. JavaScript: JavaScript本身不支持Guid,但可以使用`...

    PB生成UUID.zip

    标题中的"PB生成UUID"指的是在编程中使用Protocol Buffers(简称PB)生成Universally Unique Identifier(UUID)。UUID是一个128位的数字,通常表示为32个十六进制数字,用于唯一标识网络中的对象。它在分布式系统、...

    ThinkPad System UUID1.82

    【ThinkPad System UUID1.82】是一款专为联想ThinkPad笔记本电脑设计的系统UUID添加工具,主要用于在制作U盘启动盘时解决特定问题。UUID(Universally Unique Identifier)是全球唯一的标识符,用于区分不同的计算机...

Global site tag (gtag.js) - Google Analytics