欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

UUID中中的名字和名字空间代表什么?如何获得?

程序员文章站 2022-06-15 18:53:47
...
如题。在UUID中的v3和v5都需要名字和名字空间,百思不得其解。它们代表是什么?如何获得呢?

回复内容:

如题。在UUID中的v3和v5都需要名字和名字空间,百思不得其解。它们代表是什么?如何获得呢?

记得有次和甲方两个小伙子说道GUID,一字一顿的:“全-球-唯-一-ID”的时候,我看到本来认为技术枯燥无味的他们,眼中放出的光芒!。因为这背后有故事。这title,很响亮。

题主对命名空间和名字,百思不得其解,是因为缺乏问题的上下文,而不是 @_404_MrYes 谈及的细节。首要在于去理解:“要设计一个唯一的ID,会遇到的问题和解决方案”。

设计一个唯一id,是非常有用。比如网卡的mac地址,就得是唯一的。不如地址冲突了,网卡重复地址出现在一个公司的局域网内,发给同一地址的人,有两个或者多个人收到,就乱了。整个局域网协议都以mac地址唯一为基础,因此唯一id,是整个系统的基础。

那么,mac地址如何做到唯一?mac地址会有一个集中的机构制定一个号段,好比1号段给3com,二号给tp-link,etc .然后在这个号段内,每个网卡制造商建立自己的号,一个网卡一个。只要在自己号段内不重复,就可以保证在全世界不重复。类似的做法很多,比如条码,每个商品理论上也需要唯一,做法也类似,就是工商局(条码办)的机构,搞号段。类似的机构很多的。我要是有机会,也想去这样的地方任职,搞搞分配:)。只要是需要资源分配,不能重复的,都需要。比如各个地方的无线电委员会,划分频段资源。航空的航路也需要分配。电信管理局这样的傻部门,就负责028给成都,025给武汉的节奏。无处不在哦。

可是,在互联网的条件下,这样的统一的机构很讨厌啊是不是。去中心化的互联网,天然反感这样的集中和垄断,必然的效率损失,要是这个机构脸难看,门难进,就更加讨厌了。最好是大家做出约定,每个人有自己的命名空间,在自己的地盘内,随便自己撒野,怎么玩都行,要是内部重复了,也只会伤害自己。多*。这样,核心问题就是,是否有每个机构自己的,“天然的”,命名空间,这个空间内,自己规划自己的名字。所有的名字都在一个或者多个自己的空间内。这就是namespace的含义。

这样,你就比较好了解rfc中的 Motivation,就是去中心化(no cnetralized authority):

One of the main reasons for using UUIDs is that no centralized
authority is required to administer them (although one format uses
IEEE 802 node identifiers, others do not)
ref: http://tools.ietf.org/html/rfc4122#page-13
这样的‘天然的“命名空间,还是真有,比如microsoft 就可以说,microsoft.com就是我的命名空间,在这空间下,microsoft.com/1 就是操作系统部门,/2就是开发部门。microsoft就获得了*。你公司是foo.com.cn ,那么/1是总经理,/2 。。etc。你获得了*。专职的分配委员会之类的寄生虫,就不在必要了。

UUID就是这样的思路。名字空间+名字,保证每个机构用自己的名字空间,在名字空间内决定自己的名字,这样保证内部不重复,在外部也就不会重复。

我发现,我很喜欢科普哦。

rfc4122 4.3. Algorithm for Creating a Name-Based UUID

这里面有提及说

  • 同一namespace下,不同name的uuid不同
  • 同一namespace下,相同的name的uuid一定相同
  • 不同的namespace下,uuid一定不同
  • 如果两个name的UUID相同,那么一定是来自同一namespace下的同一name

关于name选取

The concept of name and name space should be broadly construed, and not limited to textual names.  For example, some name spaces are the domain name system, URLs, ISO Object IDs (OIDs), X.500 Distinguished Names (DNs), and reserved words in a programming language.

如何获取


o Allocate a UUID to use as a "name space ID" for all UUIDs generated from names in that name space; see Appendix C for some pre-defined values. o Choose either MD5 [4] or SHA-1 [8] as the hash algorithm; If backward compatibility is not an issue, SHA-1 is preferred.

v3版本:md5
v5版本:sha-1

BTW,这个问题google一下不就出来了么?

相关标签: uuid php