GUID到底是什么?为什么在哪里使用?


74

GUID到底是什么?为什么在哪里使用?
我已经在很多地方和Wikipedia中看到了对GUID的引用,但是告诉您在哪里使用它并不是很清楚。如果有人可以回答这个问题,那就太好了。谢谢

Answers:


108

GUID从技术上讲代表全局唯一标识符。实际上,它是一个128位结构,不可能重复或产生冲突。如果进行数学运算,则值的范围为十亿分之一

当您有多个独立的系统或客户端生成的ID需要唯一的ID时,请使用guid。

例如,如果我有5个客户端应用程序在ID上具有唯一约束的表中创建事务数据并将其插入到表中,则请使用guids。这避免了必须强制客户端首先从服务器请求发出的ID。

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


6
非常干净/简洁的答案,谢谢。但是,仅此而已(我可能已经意识到这是另一个问题),当创建说一个基于javascript / HTML的应用程序时,您需要返回记录,例如消息或其他内容,最好只将GUID返回给前端,而不是比实际的ID?推理当然是如果它是ID(自动生成的prim.key),那么猜测另一个就很容易了-而GUID显然很难猜测?
Dav.id 2011年

“价值的范围是万亿分之一” –不,范围远远大于那个。版本4 UUID的总数为2×122,即5.3x10×36(5.3 undecillion)。参见维基百科
罗勒·布尔克

24

GUID是“全局唯一标识符”。您可以在需要标识符保证彼此不同的任何地方使用它。

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

当您要定义的ID必须与其他人(控件外部)要定义的ID不同时,通常会使用GUID。ActiveX控件的接口标识符中的此类位置之一。任何人都可以创建ActiveX,却不知道别人会用---与其他控件一起使用,并且没有什么可以阻止每个人给控件使用相同的名称。GUID使它们与众不同。

GUID是时间(以很小的几分之一秒为单位)(因此可以确保与之前或之后定义的任何GUID都不一样)和定义您的位置的数字(有时取自网卡的MAC地址)的组合(因此可以确保与其他人现在定义的任何其他GUID不同)。

它们有时也称为UUID(通用唯一ID)。


3
使用Guid作为主键会减慢数据库的速度,因为索引数字比索引varchar快得多
Sergio

是的,这就是为什么我用它作为不需要GUID的地方的示例。
James Curran

1
这是读写之间的权衡。复杂的唯一整数密钥代理也存在开销。在大多数较小的数据库上,使用guid键不会有效地损害性能。在较大的数据库上,这可能会成为一个问题。同样,guid是varchars,因此没有这样的索引。
布赖恩·鲁道夫

实际上,GUID是标准UUID的特定变体。具体来说,以三位模式(110x N = c..d,3位)标识“变体2”。换句话说,所有的GUID都是UUID,但并非所有的UUID都是GUID。GUID主要在Microsoft平台上使用。Microsoft文档在引用所有类型的UUID时有时会使用“ GUID”,因此该术语可能会造成混淆。
罗勒·布尔克

15

除了所有其他答案之外,这里还有一个在线GUID生成器

http://www.guidgenerator.com/

什么是GUID?

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

GUID有多独特?

128位足够大,并且生成算法也足够独特,如果在一年内每秒生成1,0000,000,000 GUID,则重复的可能性仅为50%。或者,如果地球上每个人都产生600,000,000 GUID,那么复制的可能性只有50%。

GUID如何使用?

GUID在软件开发中用作数据库密钥,组件标识符或几乎其他任何需要真正唯一标识符的地方。GUID还用于识别COM编程中的所有接口和对象。


1
在Windows世界中,生成GUID的一种简单方法是使用Powershell命令:[Guid] :: NewGuid()。ToString()。ToUpperInvariant()
Milan

请参阅我对Curran的Answer的评论。严格来说,所有GUID都是UUID,但并非所有UUID都是GUID
罗勒·布尔克

12

GUID是“全局唯一ID”。也称为UUID(通用唯一ID)。

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

GUID的一种广泛用途是用作Windows上COM实体(类,类型库,接口等)的标识符。使用GUID,开发人员可以构建其COM组件,而无需前往Microsoft获得唯一标识符。尽管识别COM实体是GUID的主要用途,但它们用于许多需要唯一标识符的事物。一些开发人员将为数据库记录生成GUID,以为其提供ID,即使它们在许多不同的数据库中必须是唯一的,也可以使用该ID。

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

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

因为GUID可能很笨拙(从人类可读的角度来看,它们是一串十六进制数字,通常按如下方式进行分组:aaaaaaaa-bbbb-cccc-dddd-ffffffffffffff),因此在不同组织中需要唯一名称的某些名称空间会使用另一种方案(通常基于Internet域名)。

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

com.example.jpackage

这意味着处理名称冲突成为每个组织的责任。

XML名称空间也以类似的方式变得唯一-按照惯例,创建XML名称空间的人应该使其在其控制下的注册域名“下方”。例如:

xmlns="http://www.w3.org/1999/xhtml"

管理唯一ID的另一种方法是针对以太网MAC地址。制造以太网卡的公司必须获得IEEE(我认为是IEEE)分配给它们的地址块。在这种情况下,该方案运行良好,即使制造商拧紧并发行具有重复MAC地址的卡,只要这些卡不在同一个子网中(因为在子网之外,也只有IP),一切仍然可以正常进行。地址用于路由数据包。尽管MAC地址还有其他用途可能会受到影响-生成GUID的算法之一使用MAC地址作为一个参数。此GUID生成方法不再被广泛使用,因为它被认为是隐私威胁。

Microsoft提供的ID标识用于Windows 9x中的“ VxD”驱动程序,该方案无法很好地使用唯一标识符的方案的一个示例。第三方VxD驱动程序的开发人员应要求Microsoft提供一组ID,以供第三方编写的任何驱动程序使用。这样,Microsoft可以确保没有重复的ID。不幸的是,许多驱动程序编写者从不打扰,只是简单地使用了他们用作起点的示例VxD中的任何ID。我不确定这会造成多少麻烦-我认为VxD ID唯一性不是绝对必要的,但是它可能影响了某些API中的某些功能。


10

GUID或UUID(全局或通用)唯一IDentifier是唯一ID :)当您需要生成真正独特的计算机时,可以使用一些库来获得。

在维基百科上查看GUID详细信息,。

至于何时不需要GUID,是指您控制的计数器(一种或多种方式,例如SERIAL SQL类型或序列)递增。索引一个“文本”值(文本形式的GUID)或一个128位二进制值(GUID是索引)比整数要昂贵得多。


6

有人说它们从概念上讲是128位随机值,这确实是对的,但是在对UUID进行了一些阅读之后(GUID通常指的是Microsoft的UUID的实现),我看到有几种不同的UUID版本,其中大多数是UUID版本实际上不是随机的。因此,有可能为机器(或其他东西)生成一个UUID,并能够可靠地重复该过程,从而在以后获得相同的UUID,这对于某些应用程序很重要。


1
人们在谈论GUID时通常不会意识到这一点
BobbyShaftoe

5

对我来说,将它们简单地视为“ 128位随机值”会更容易。本质上就是它们。有一些算法可以在GUID的几位数中包含一些信息(因此,随机部分会变小),但是它们仍然是相当大的几乎随机的值。

由于它们太大,因此非常不可能生成两个相同的GUID。出于所有实际目的,曾经生成的每个GUID在世界上都是唯一的。

我将留给您确定在哪里使用它们,但是其他答案已经有一些示例。让想象力自由驰骋。:)


1
将它们视为“ 128位随机值”可能会更容易,但是如果滥用它们,可能会导致一些问题。雷蒙德·陈(Raymond Chan)在他们的博客
Jon

该链接已断开,因此这里是更新的链接:devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
Vilx-

但是,我要指出的是,当今最常见的GUID是版本4 GUID,它实际上几乎是所有随机位。
Vilx-

4

由于生成它们之后的所有数学运算,这可能很难理解。将其视为唯一的ID。您可以使Visual Studio为您生成一个,如果您恰巧使用C#或许多其他应用程序或网站之一,则可以使用.NET。它们之所以被认为是独特的,是因为您几乎没有机会考虑到两次机会看到相同的机会,这是一个愚蠢的机会。


4

128位全局唯一ID。从现在开始直到日落,您都可以生成GUID,并且永远不会两次生成相同的GUID,其他任何人也不会。它们与COM一起使用很多。

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


4

几年前,我在ACD呼叫中心系统上工作,我们希望将多个呼叫处理器的呼叫详细记录收集到一个数据库中。我在MS SQL中设置了一个列,以生成数据库密钥的GUID,而不是使用系统生成的顺序ID(身份列)。那时,这需要将默认值设置为NewID(或在代码中生成它,但是NewID()函数更安全)。当然,拥有较大的钥匙价值可能会引起一些注意,但我宁愿放弃空间也不愿冒险。

我没有看到有人使用GUID作为数据库密钥来寻址,因此我认为知道您也可以这样做会有所帮助。


3

GUID代表“全局唯一标识符”,如果您想拥有一个全局唯一标识符,则可以使用它。

例如,在RSS提要中,提要中的每个项目都应该有一个GUID。这样,提要阅读器软件可以跟踪您是否已阅读该项目。没有GUID,就不可能分辨出来。

GUID与数据库ID之类的区别在于,无论谁创建对象(您,我,街上的家伙),我们的GUID始终是不同的。使用GUID不应有冲突。

您还将看到术语UUID,它代表“通用唯一标识符”。两者之间基本上没有区别。UUID是更合适的术语。GUID是Microsoft使用的术语。


3

如果需要生成在应用程序的整个生命周期中唯一的标识符,则可以使用GUID。

假设您有一台带有会话的服务器,如果为每个会话提供一个GUID,则可以确定它对于服务器创建的每个会话都是唯一的。这对于跟踪错误很有用。


3

我发现GU​​ID的一个特别有用的应用程序是使用它们来跟踪Web应用程序中唯一匿名的访客(即访客未登录或未注册)。



1

维基百科上的GUID文章是很清楚他们所使用的-也许改写你的问题将帮助-你有什么需要一个GUID?


“您需要什么GUID?” 我认为这是问题所在。
迈克尔·迈尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.