讨论UUID的定义、分类、应用及生成工具。
什么是UUID?
UUID
是Universally 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
----------------------------------------------------------------------------
分享到:
相关推荐
cmd->CommandText = "CREATE TABLE Employees (ID AUTOINCREMENT PRIMARY KEY, Name VARCHAR(50), Position VARCHAR(50))"; cmd->Execute(NULL, NULL, adCmdText); ``` 插入记录: ```cpp cmd->CommandText = ...
在这个过程中,`server-id` 和 `server-uuid` 是两个至关重要的配置参数,它们对于复制过程的正常运行起到关键作用。 **server-id** 是 MySQL 实例的一个唯一标识符,用于区分主从节点。当搭建主从复制环境时,每个...
# 返回匹配的db.models.S3Image.uuid给image_uuid; image_uuid = ec2utils.id_to_glance_id(context, image['id']) # 获取镜像image的状态; if image: image_status = image['status'] ``` ##### 2. 方法...
2.原来sql server里的自增长id改为wabacus里的uuid{} 3.class里拼凑的sql改成参数的了 4.db.sql是表结构和表数据 ====20120816==== 1.说明: 这是一个用wabacus3.4制作的小例子(本地环境wabacus3.4+tomcat7+jdk1.7...
这里,`id: :uuid, default: 'uuid_generate_v4()'`确保每条新记录的ID都会自动使用`uuid_generate_v4()`函数生成。 如果不想使用UUID作为主键,而是想在模型中添加一个额外的UUID字段,可以这样做: ```ruby ...
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...
临床_tcga 用于从 TCGA 解析元... 如果还包括一个 UUID 到条形码 ID 的转换工具。 单个 UUID 可以这样转换: convert_tcga_uuid.rb sample_uuid或者多个 UUID 在作为文件提供时可以一次转换: convert_tcga_uuid.rb -f
在用户界面中创建并设置实验后,您可以通过从路由API(/ api / v1 / experiments / route)接收每个用户ID(如有必要,为uuid)的分配来自由地执行AB测试。 入门 安装 您可以使用pip快速安装它,如下所示。 pip ...
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;...
[root@12cdbrac1 ~]# scsi_id -g -u /dev/sd* 36000c298a780c6a3f277215e76b357cb 看此命令是否能获取到磁盘的UUID值,正常情况是能获取到的,如果没有获取到,请查检12cdbrac1.vmx文件中是否添加了这一项disk....
总的来说,`javabean(DB)`指的是一个与数据库操作相关的JavaBean组件,它可能包含一系列用于数据库交互的方法和属性,是Java应用中数据持久化和业务处理的关键部分。在实际项目中,我们需要根据具体需求来设计和使用...
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)...
User Id=myUsername;Password=myPassword;"); conn->Open(connStr, NULL, NULL, NULL); ``` 然后,我们可以通过`ADODB::Command`对象执行SQL查询或操作,如创建`ADODB::Recordset`对象来获取数据: ```cpp ADODB::...
ID记录器 这是一个使用可配置数据源(例如数据库)存储播放器的UUID和名称的插件。 目的是将其用作需要在服务器之间持久存储UUID /名称的其他插件的依赖项。 我在将插件更新为在1.8更新中使用UUID时,在另一个插件...
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”中,我们将探讨如何使用Python SDK与Azure Cosmos DB的Cassandra API来构建一个应用程序。Azure Cosmos DB是微软提供的一款全球分布式...
第二部分介绍了如何使用ADOX创建ACCESS数据库。首先,创建一个Catalog对象,然后调用其Create方法。在VC++中,这可以通过以下代码实现: ```cpp _CatalogPtr m_pCatalog = NULL; m_pCatalog.CreateInstance(__uuid...
pCommand->put_CommandText(L"CREATE TABLE Employees (ID INT, Name VARCHAR(50));"); pCommand->Execute(NULL, NULL, ADO::adCmdText); ``` 4. 操作Recordset: - Recordset对象代表了数据库中的一组记录,...
User ID=Username;Password=Password;"); conn->Open(connStr, "", "", adConnectUnspecified); _CRecordsetPtr rs; rs.CreateInstance(__uuidof(Recordset)); rs->Open("SELECT * FROM YourTable", conn, ...