`
fantaxy025025
  • 浏览: 1279168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

DB_ID_UUID_是什么(二)

阅读更多

讨论UUID的定义、分类、应用及生成工具。

什么是UUID?

UUIDUniversally Unique Identifier 的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。UUID具有以下涵义:


经由一定的算法机器生成
为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。

非人工指定,非人工识别
UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。

在特定的范围内重复的可能性极小
UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。

UUID是16字节128位长的数字,通常以36字节的字符串表示,示例如下:

3F2504E0-4F89-11D3-9A0C-0305E82C3301

其中的字母是16进制表示,大小写无关

GUID (Globally Unique Identifier)是UUID的别名;但在实际应用中,GUID通常是指微软实现的UUID。

UUID的版本

UUID具有多个版本,每个版本的算法不同,应用范围也不同。

首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:

00000000-0000-0000-0000-000000000000

UUID Version 1:基于时间的UUID

基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯 一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP 地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。

UUID Version 2:DCE安全的UUID

DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

UUID Version 3:基于名字的UUID(MD5)

基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。

UUID Version 4:随机UUID

根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。

UUID Version 5:基于名字的UUID(SHA1)

和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

UUID的应用

从UUID的不同版本可以看出,Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下;至于Version 4,我个人的建议是最好不用(虽然它是最简单最方便的)。

通常我们建议使用UUID来标识对象或持久化数据,但以下情况最好不使用UUID:


映射类型的对象。比如只有代码及名称的代码表。
人工维护的非系统生成对象。比如系统中的部分基础数据。
对于具有名称不可重复的自然特性的对象,最好使用Version 3/5的UUID。比如系统中的用户。如果用户的UUID是Version 1的,如果你不小心删除了再重建用户,你会发现人还是那个人,用户已经不是那个用户了。(虽然标记为删除状态也是一种解决方案,但会带来实现上的复杂 性。)

UUID生成器

我没想着有人看完了这篇文章就去自己实现一个UUID生成器,所以前面的内容并不涉及算法的细节。下面是一些可用的Java UUID生成器:


Java UUID Generator (JUG):开源UUID生成器,LGPL协议,支持MAC地址。
UUID:特殊的License,有源码。
Java 5以上版本中自带的UUID生成器:好像只能生成Version 3/4的UUID。

此外,Hibernate中也有一个UUID生成器,但是,生成的不是任何一个(规范)版本的UUID,强烈不建议使用。

 

----------------------------------------------------------------------------

http://dilantaya20070723211817.iteye.com/blog/424453

----------------------------------------------------------------------------

分享到:
评论

相关推荐

    CREATE_DB_AND_TABLE_add_edit_del-pw.rar_CREATE_DB_AND_TABLE_Tabl

    cmd->CommandText = "CREATE TABLE Employees (ID AUTOINCREMENT PRIMARY KEY, Name VARCHAR(50), Position VARCHAR(50))"; cmd->Execute(NULL, NULL, adCmdText); ``` 插入记录: ```cpp cmd->CommandText = ...

    MySQL主从同步中的server-id示例详解

    在这个过程中,`server-id` 和 `server-uuid` 是两个至关重要的配置参数,它们对于复制过程的正常运行起到关键作用。 **server-id** 是 MySQL 实例的一个唯一标识符,用于区分主从节点。当搭建主从复制环境时,每个...

    OpenStack源码分析-NOVA

    # 返回匹配的db.models.S3Image.uuid给image_uuid; image_uuid = ec2utils.id_to_glance_id(context, image['id']) # 获取镜像image的状态; if image: image_status = image['status'] ``` ##### 2. 方法...

    wabacus制作的一个填写周报的小例子_oracle版

    2.原来sql server里的自增长id改为wabacus里的uuid{} 3.class里拼凑的sql改成参数的了 4.db.sql是表结构和表数据 ====20120816==== 1.说明: 这是一个用wabacus3.4制作的小例子(本地环境wabacus3.4+tomcat7+jdk1.7...

    使用Ruby on Rails和PostgreSQL自动生成UUID的教程

    这里,`id: :uuid, default: 'uuid_generate_v4()'`确保每条新记录的ID都会自动使用`uuid_generate_v4()`函数生成。 如果不想使用UUID作为主键,而是想在模型中添加一个额外的UUID字段,可以这样做: ```ruby ...

    一个简单的Redis开发教程

    session_id = str(uuid.uuid4()) # 将 session 数据存储到 Redis r.set(session_id, data) return session_id def get_session(session_id): # 根据 session_id 从 Redis 获取 session 数据 return r.get...

    clinical_tcga:用于解析来自 TCGA 的临床元数据文件的库

    临床_tcga 用于从 TCGA 解析元... 如果还包括一个 UUID 到条形码 ID 的转换工具。 单个 UUID 可以这样转换: convert_tcga_uuid.rb sample_uuid或者多个 UUID 在作为文件提供时可以一次转换: convert_tcga_uuid.rb -f

    abing:使用FASTAPI进行FAST AB测试集成

    在用户界面中创建并设置实验后,您可以通过从路由API(/ api / v1 / experiments / route)接收每个用户ID(如有必要,为uuid)的分配来自由地执行AB测试。 入门 安装 您可以使用pip快速安装它,如下所示。 pip ...

    Mysql全局ID生成方法

    function next_id_db($name) { $seq_dao = Wk_Sequence_Dao_Sequence::getInstance(); $threshold = 100; for ($i = 0; $i $threshold; $i++) { $last_id = $seq_dao->get_seq_id($name); $id = $last_id + 1;...

    数据库集群部署—TY.docx

    [root@12cdbrac1 ~]# scsi_id -g -u /dev/sd* 36000c298a780c6a3f277215e76b357cb 看此命令是否能获取到磁盘的UUID值,正常情况是能获取到的,如果没有获取到,请查检12cdbrac1.vmx文件中是否添加了这一项disk....

    javabean(DB)

    总的来说,`javabean(DB)`指的是一个与数据库操作相关的JavaBean组件,它可能包含一系列用于数据库交互的方法和属性,是Java应用中数据持久化和业务处理的关键部分。在实际项目中,我们需要根据具体需求来设计和使用...

    VC++中Ado操作acess数据库

    CString strcnn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source=") + filename); try { ADOX::_CatalogPtr m_pCatalog = NULL; hr = m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog)); if (FAILED(hr)...

    VCDB.rar_vc和vcdb

    User Id=myUsername;Password=myPassword;"); conn->Open(connStr, NULL, NULL, NULL); ``` 然后,我们可以通过`ADODB::Command`对象执行SQL查询或操作,如创建`ADODB::Recordset`对象来获取数据: ```cpp ADODB::...

    IDLogger:用于将所有玩家的UUID和名称记录到MySQL或SQLite DB的API

    ID记录器 这是一个使用可配置数据源(例如数据库)存储播放器的UUID和名称的插件。 目的是将其用作需要在服务器之间持久存储UUID /名称的其他插件的依赖项。 我在将插件更新为在1.8更新中使用UUID时,在另一个插件...

    基本ado数据库操作.rar_ ADO ACCESS _ADO ACCESS_VC 数据库_access_vc ado acce

    BSTR connStr = _bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\myDatabase.mdb;"); pConnection->Open(connStr, "", "", adConnectUnspecified); ``` 这里,`Provider`指定了数据提供者,`Data Source...

    lab_azure_build-cassandra-app-with-python-sdk-azure-cosmos-db

    在这个实验“lab_azure_build-cassandra-app-with-python-sdk-azure-cosmos-db”中,我们将探讨如何使用Python SDK与Azure Cosmos DB的Cassandra API来构建一个应用程序。Azure Cosmos DB是微软提供的一款全球分布式...

    VC++使用ADO开发ACCESS数据库.pdf

    第二部分介绍了如何使用ADOX创建ACCESS数据库。首先,创建一个Catalog对象,然后调用其Create方法。在VC++中,这可以通过以下代码实现: ```cpp _CatalogPtr m_pCatalog = NULL; m_pCatalog.CreateInstance(__uuid...

    vc_ado.zip_ado vc 例程

    pCommand->put_CommandText(L"CREATE TABLE Employees (ID INT, Name VARCHAR(50));"); pCommand->Execute(NULL, NULL, ADO::adCmdText); ``` 4. 操作Recordset: - Recordset对象代表了数据库中的一组记录,...

    MSSQLSERVER.rar_C++操作sql server

    User ID=Username;Password=Password;"); conn->Open(connStr, "", "", adConnectUnspecified); _CRecordsetPtr rs; rs.CreateInstance(__uuidof(Recordset)); rs->Open("SELECT * FROM YourTable", conn, ...

Global site tag (gtag.js) - Google Analytics