GUID是什么?为什么以及在哪里应该使用它?

95

什么是GUID?为什么和在哪里使用它?
我在很多地方,包括维基百科中都看到了GUID的引用,但没有明确说明何时要使用它。 如果有人能回答这个问题就好了。 谢谢。

16个回答

136

GUID技术上代表全球唯一标识符。 实际上,它是一个128位的结构体,不太可能重复或产生冲突。如果进行数学计算,其值域在无量级

在多个独立系统或客户端生成需要唯一标识符的ID时,请使用GUID。

例如,如果有5个客户端应用程序创建和插入事务数据到一个具有ID唯一约束的表中,则使用GUID。这可以避免强制客户端首先从服务器请求已发布的ID。

对于对象工厂和具有存储在不同表中的众多对象类型的系统也非常适用,其中不希望任何两个对象具有相同的ID。这使得缓存和清除模式更容易实现。


6
非常干净/简洁的答案,谢谢。然而,这个问题还有一个方面(我意识到可能已经是另一个问题了),当创建基于JavaScript/HTML的应用程序时,如果需要返回记录,例如消息或其他东西,是最好只返回一个GUID给前端,而不是实际的ID吗?理由当然是如果使用ID(自动生成的主键),那么很容易猜到另一个ID - 而GUID显然更难猜测? - Dav.id
“值域在百万亿级别” - 不,该值域比那还要广泛得多。版本4 UUID的可能总数为2ʌ122,或5.3x10ʌ36(5.3 [十非](https://en.wikipedia.org/wiki/Names_of_large_numbers#Standard_dictionary_numbers))。请参见[Wikipedia](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29)。 - Basil Bourque

31

一个GUID是一个“全球唯一标识符”。您可以在任何需要与其他标识符保证不同的地方使用它。

通常,您只需要一个值是“局部唯一”的 - 例如数据库表中的主键标识,只需与该表中的其他行不同即可,但可以与其他表中的ID相同。(此处不需要GUID)

当您需要定义一个与您无法控制的他人定义的ID不同的ID时,通常会使用GUID。其中一个地方是ActiveX控件的接口标识符。任何人都可以创建ActiveX,并且不知道其他人将使用哪些控件 - - 而没有任何阻止所有人为其控件赋予相同的名称。GUID使它们保持独特。

GUID是时间(以非常小的秒数为单位)和定义您位置的数字的组合(有时取自您网络卡的MAC地址)(因此,它与其他人现在定义的任何其他GUID肯定是不同的)。

它们有时也被称为UUID(通用唯一标识符)。

4
使用Guid作为主键会降低数据库的速度,因为索引数字比索引varchar要快得多。 - Sergio
1
是的,这就是为什么我将其用作不需要GUID的示例地点。 - James Curran
1
这是读写之间的权衡。复杂的唯一整数键交易也存在开销。在大多数较小的数据库中,使用GUID键基本上不会影响性能。但在较大的数据库中,可能会成为问题。此外,GUID是varchars类型,并不被索引。 - Brian Rudolph
实际上,GUID是标准UUID的特定变体,具体来说是由三位比特模式(110x N=c..d,3位)识别的“变体2”。换句话说,所有GUID都是UUID,但并非所有UUID都是GUID。 GUID主要用于Microsoft平台。Microsoft文档有时在引用所有类型的UUID时使用“GUID”,因此术语可能会令人困惑。 - Basil Bourque

18

除了其他回答之外,这里有一个在线GUID生成器:

http://www.guidgenerator.com/

什么是GUID?

GUID(或UUID)是“全局唯一标识符”(或“通用唯一标识符”的首字母缩写)。它是一个128位整数,用于标识资源。术语GUID通常由使用Microsoft技术的开发人员使用,而UUID在其他地方使用。

GUID有多独特?

128位足够大,且生成算法足够独特,如果每秒生成1,000,000,000个GUID,持续1年,重复的概率仅为50%。或者如果地球上的每个人都生成600,000,000个GUID,则只有50%的概率会重复。

GUID如何使用?

GUID用于软件开发中的数据库键、组件标识符或任何需要真正唯一标识符的地方。GUID还用于标识COM编程中的所有接口和对象。


1
在Windows世界中生成GUID的简单方法是使用Powershell命令:[Guid] :: NewGuid()。ToString()。ToUpperInvariant() - Milan Gardian
请查看我在Curran的回答下的评论。严格来说,所有GUID都是UUID,但不是所有UUID都是GUID - Basil Bourque

12

GUID是“全局唯一标识符”的缩写,也称为UUID(通用唯一标识符)。

它基本上是一个128位的数字,以一种方式生成(请参见RFC 4112 http://www.ietf.org/rfc/rfc4122.txt),使得几乎不可能生成重复的数字。这样,我可以生成GUID而无需某个第三方组织给予我确保它们是唯一的。

GUID的广泛使用之一是作为Windows上COM实体(类、类型库、接口等)的标识符。使用GUID,开发人员可以在不去Microsoft获取唯一标识符的情况下构建他们的COM组件。尽管标识COM实体是GUID的主要用途,但它们用于许多需要唯一标识符的事情。一些开发人员将为数据库记录生成GUID,以为它们提供可在必须在许多不同数据库之间唯一时使用的ID。

通常,您可以将GUID视为序列号,任何人都可以随时生成它们,并且他们知道序列号将是唯一的。

获取唯一标识符的其他方法包括获取域名。为确保域名的唯一性,您必须从某些组织(最终由ICANN管理)获得它。

由于GUID可能很难处理(从人类可读的角度来看,它们是一串十六进制数字,通常分组如下:aaaaaaaa-bbbb-cccc-dddd-ffffffffffff),因此需要在不同组织之间使用另一种方案的某些命名空间(通常基于Internet域名)。

因此,按照惯例,Java包的命名空间以组织的域名(倒序)开头,后面跟着以某种组织特定方式确定的名称。例如,Java包的名称可能为:

com.example.jpackage

这意味着处理名称冲突成为每个组织的责任。
XML命名空间也是以类似的方式唯一标识的 - 根据约定,创建XML命名空间的人应该将其放在他们控制下的已注册域名“下面”。例如:
xmlns="http://www.w3.org/1999/xhtml"

另一种管理唯一标识符的方法是以太网MAC地址。制造以太网卡的公司必须向IEEE(我认为是IEEE)获取一组分配给它们的地址块。在这种情况下,该方案运作得相当不错,即使制造商出现了发行具有重复MAC地址的卡的错误,只要这些卡不在同一个子网上,事情仍将正常工作,因为在子网之外,仅使用IP地址来路由数据包。虽然还有一些其他用途的MAC地址可能会受到影响 - 生成GUID的算法之一使用MAC地址作为一个参数。由于被认为存在隐私威胁,这种GUID生成方法已不再广泛使用。
一个想出独特标识符的方案的例子并没有很好地运作,这是Windows 9x中提供的“VxD”驱动程序的Microsoft提供的ID。第三方VxD驱动程序的开发人员应该向Microsoft请求一组ID,以便用于第三方编写的任何驱动程序。这样,Microsoft可以确保没有重复的ID。不幸的是,许多驱动程序编写者从未费心去做,而只是使用示例VxD中的任何ID作为起点。我不确定这会引起多大麻烦 - 我认为VxD ID的唯一性并不是绝对必要的,但它可能会影响某些API中的某些功能。

11

GUID或UUID(全球唯一标识符或通用唯一标识符)是一个独特的ID :) 当您需要一些真正独特的机器生成内容时,有一些库可以帮助您获得它。

请参见维基百科上的GUID了解详细信息。

当您控制计数器(以某种方式,如SERIAL SQL类型或序列)递增时,就不需要GUID。索引“文本”值(GUID的文本形式)或128位二进制值(GUID是其中之一)比整数更昂贵。


6
对我来说,最简单的想法就是将它们看作“128位随机值”。这基本上就是它们的本质。有一些算法可以在您的GUID的几个数字中包含一点信息(因此随机部分变小了一点),但它们仍然是非常大的、几乎随机的值。
由于它们如此巨大,极不可能生成两个相同的GUID。对于所有实际目的,每个生成的GUID都是世界上唯一的。
我会让你去想如何使用它们,但其他答案已经提供了一些例子。让您的想象力奔放吧! :)

1
可能更容易将它们视为“128位随机值”,但如果滥用它们,就会导致一些问题。雷蒙德·陈在他的博客中有一个很好的文章介绍了它们。http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx - Jon
那个链接已经失效了,这是更新后的链接:https://devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823 - Vilx-
我要注意的是,如今最常见的GUID是版本4 GUID,它确实几乎全部由随机位组成。 - Vilx-

6

有人说UUID是概念上的128位随机值,这基本上是正确的,但在阅读了一些关于UUID(GUID通常指微软对UUID的实现)的内容后,我发现有几个不同的UUID版本,其中大多数实际上并不是随机的。因此,可以为计算机(或其他东西)生成UUID,并能够可靠地重复该过程以获得相同的UUID,这对某些应用程序非常重要。


1
这是人们在谈论GUID时通常没有意识到的事情。 - BobbyShaftoe

4

生成 GUID 可能会让人感到困难,因为这需要进行大量的数学计算。将其视为唯一标识符。您可以让 Visual Studio 为您生成一个,或者如果您正在使用 C# 或其他许多应用程序或网站,则可以使用 .NET。它们被认为是唯一的,因为有如此微小的机会会看到相同的 GUID,以至于不值得考虑。


4

128位全局唯一标识符。您可以生成GUID,直到日落,您永远不会生成相同的GUID,其他人也不会。它们在COM中被广泛使用。

例如,我们在其中一个产品中使用它们。我们的用户可以在各种设备上生成类别和卡片。我们希望确保我们不会混淆在一个设备上创建的类别与在另一个设备上创建的类别,因此无论谁生成它们,何时生成它们以及在哪里生成它们,都很重要确保ID是唯一的。因此,我们使用GUID(实际上,我们使用自己的64位数字方案,但它们类似于GUID)。


4
我几年前在一个ACD呼叫中心系统上工作过,我们希望将多个呼叫处理器的通话详单记录汇总到一个数据库中。我在MS SQL中设置了一个列来生成数据库键的GUID,而不是使用系统生成的顺序ID(自增列)。当时,这需要将默认值设置为NewID(或在代码中生成它,但NewID()函数更安全)。当然,一个键的值很大可能会引起一些疑问,但我宁愿放弃空间也不愿冒碰撞的风险。
我没有看到有人讨论使用GUID作为数据库键,所以我想知道这也可能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接