顺序的GUID [英] Sequential GUIDs

查看:463
本文介绍了顺序的GUID的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望有人能回答这个问题。

I hope someone can answer this question.

如何在Rpcrt4.dll中类使用UuidCreateSequential方法种子它的GUID?

How does the UuidCreateSequential method in the rpcrt4.dll class use to seed it's guids?

我知道这么多:
微软改变了UuidCreate功能,使其不再使用本机的MAC地址作为UUID的一部分。由于CoCreateGuid呼吁UuidCreate来获得它的GUID,它的输出也发生了变化。如果你还是喜欢的GUID被按顺序产生的(有助于在系统注册表中保存的GUID的相关组合在一起),您可以使用UuidCreateSequential函数。

I know this much: Microsoft changed the UuidCreate function so it no longer uses the machine's MAC address as part of the UUID. Since CoCreateGuid calls UuidCreate to get its GUID, its output also changed. If you still like the GUIDs to be generated in sequential order (helpful for keeping a related group of GUIDs together in the system registry), you can use the UuidCreateSequential function.

这个问题背后的原因是。如果我用这个功能来生成一个Web集群顺序的GUID,我怎么能保证GUID是接近了一系列的GUID没有被复制的GUID的潜力?

The reason behind the question is. If I use this function to generate sequential GUIDs in a web cluster, how can I ensure that the GUIDs are close to a range of GUIDs without the potential of the GUID being duplicated?

推荐答案

Win32的 UuidCreateSequential 创建的 版本1 UUID

The Win32 UuidCreateSequential creates a Version 1 uuid.

下面是一些示例版本1 UUID的使用 UuidCreateSequential 我的计算机上创建的:

Here's some sample version 1 uuid's created on my computer using UuidCreateSequential:

{1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1}
{220FB46C-63D1-11E1-80DB-B8AC6FBE26E1}

这是非常重要的首先要注意的是,这些UUID包含我的机器的MAC地址( B8AC6FBE26E1 ):

The first thing that's important to note that these uuid contain my machine's MAC address (B8AC6FBE26E1):

                        Node
======================= ============
1BE8D85D-63D1-11E1-80DB B8AC6FBE26E1
1BE8D85E-63D1-11E1-80DB B8AC6FBE26E1
1BE8D85F-63D1-11E1-80DB B8AC6FBE26E1
1BE8D860-63D1-11E1-80DB B8AC6FBE26E1
1BE8D861-63D1-11E1-80DB B8AC6FBE26E1
1BE8D862-63D1-11E1-80DB B8AC6FBE26E1
1BE8D863-63D1-11E1-80DB B8AC6FBE26E1
1BE8D864-63D1-11E1-80DB B8AC6FBE26E1
1BE8D865-63D1-11E1-80DB B8AC6FBE26E1
220FB46C-63D1-11E1-80DB B8AC6FBE26E1

所以,如果你希望对不同的计算机生成GUID的是接近对方,你会失望的。

So if you're hoping for different computers to generate guid's that are "close" to each other, you're going to be disappointed.

让我们来看看其余值。

七剩下的10个字节的半字节是一个时间戳;因为 15 00:00:00 1582年10月为100ns间隔数即可。重新排列这些时间戳字节加在一起:

Seven and a half bytes of the remaining 10 bytes are a timestamp; the number of 100ns intervals since 00:00:00 15 October 1582. Rearranging those timestamp bytes together:

Timestamp              Node
=============== ====== ============
1E163D11BE8D85D 1-80DB B8AC6FBE26E1
1E163D11BE8D85E 1-80DB B8AC6FBE26E1
1E163D11BE8D85F 1-80DB B8AC6FBE26E1
1E163D11BE8D860 1-80DB B8AC6FBE26E1
1E163D11BE8D861 1-80DB B8AC6FBE26E1
1E163D11BE8D862 1-80DB B8AC6FBE26E1
1E163D11BE8D863 1-80DB B8AC6FBE26E1
1E163D11BE8D864 1-80DB B8AC6FBE26E1
1E163D11BE8D865 1-80DB B8AC6FBE26E1
1E163D1220FB46C 1-80DB B8AC6FBE26E1

您可以看到在同一台机器上创建的GUID的由 UuidCreateSequential 会在一起,因为他们是按时间顺序排列。

You can see that guid's created on the same machine by UuidCreateSequential will be together, as they are chronological.

的< STRONG> 1 你看到的是版本号的,在这种情况下,这意味着一个的基于时间的UUID。有5个定义的版本:

The 1 you see is the version number, in this case meaning a time based uuid. There are 5 defined versions:


  • 1:基于时间的版本( UuidCreateSequential

  • 2:DCE安全的版本,具有嵌入式POSIX的UID

  • 3:使用MD5散列

  • 基于名字的版本
  • 4:随机或伪随机生成的版本( UuidCreate

  • 5:使用SHA-1散列基于名字的版本

  • 1: time based version (UuidCreateSequential)
  • 2: DCE Security version, with embedded POSIX UIDs
  • 3: Name-based version that uses MD5 hashing
  • 4: Randomly or pseudo-randomly generated version (UuidCreate)
  • 5: Name-based version that uses SHA-1 hashing

捐赠:

Timestamp       Version      Node
=============== ======= ==== ============
1E163D11BE8D85D 1       80DB B8AC6FBE26E1
1E163D11BE8D85E 1       80DB B8AC6FBE26E1
1E163D11BE8D85F 1       80DB B8AC6FBE26E1
1E163D11BE8D860 1       80DB B8AC6FBE26E1
1E163D11BE8D861 1       80DB B8AC6FBE26E1
1E163D11BE8D862 1       80DB B8AC6FBE26E1
1E163D11BE8D863 1       80DB B8AC6FBE26E1
1E163D11BE8D864 1       80DB B8AC6FBE26E1
1E163D11BE8D865 1       80DB B8AC6FBE26E1
1E163D1220FB46C 1       80DB B8AC6FBE26E1

最后的的包含了两件事情。

The last word contains two things.

低12位的是机器specifc的时钟序列号:

The lower 12 bits is the machine-specifc Clock Sequence number:

Timestamp       Version   Clock Sequence   Node
=============== ======= = ================ ============
1E163D11BE8D85D 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D85E 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D85F 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D860 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D861 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D862 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D863 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D864 1       8 0DB              B8AC6FBE26E1
1E163D11BE8D865 1       8 0DB              B8AC6FBE26E1
1E163D1220FB46C 1       8 0DB              B8AC6FBE26E1

本机广泛持久的数值增加,如果:

This machine-wide persistent value is incremented if:


  • 您交换网络卡

  • 您生成一个UUID从最后一个小于100ns(和时间戳会发生冲突)

所以,再次,任何GUID由 UuidCreateSequential 创建的意志(理想情况下)具有相同的时钟序列数量,使他们接近给对方。

So, again, any guid's created by UuidCreateSequential will (ideally) have the same Clock Sequence number, making them "near" to each other.

最后2位,被称为< STRONG>变,然后始终设置为二进制 10

The final 2 bits, is called a Variant, and is always set to binary 10:

Timestamp       Version Variant Clock Sequence   Node
=============== ======= ======= ================ ============
1E163D11BE8D85D 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D85E 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D85F 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D860 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D861 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D862 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D863 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D864 1       8       0DB              B8AC6FBE26E1
1E163D11BE8D865 1       8       0DB              B8AC6FBE26E1
1E163D1220FB46C 1       8       0DB              B8AC6FBE26E1

所以你有它。顺序的GUID是连续的;如果你的在同一台机器的他们将是近在数据库对方。

So there you have it. Sequential guid's are sequential; and if you create them on the same machine they will be "near" to each other in a database.

但是你想知道究竟发生了与两个连续的UUID的不同计算机上创建的。

But you want to know what actually happens with two sequential UUID's created on different computers.

使用我们的版本的新知识1的GUID,让我们构造两个GUID的从不同的机器,如相同的时间戳:

Using our newfound knowledge of Version 1 guids, let's construct two guid's for the same timestamp from different machines, e.g.:

{1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D85D-63D1-11E1-80DB-123456789ABC}

首先,让我们插入了一堆的GUID与连续时间戳。首先创建一个临时表来存储GUID在和的群集的由GUID:

First let's insert a bunch of guid's with sequential timestamps. First create a temporary table to store our guid's in, and cluster by the guid:

--DROP table #uuidOrderingTest
CREATE TABLE #uuidOrderingTest
( 
    uuid uniqueidentifier not null
)

CREATE clustered index IX_uuidorderingTest_uuid ON #uuidOrderingTest 
( 
   uuid
)

现在插入数据:

INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D866-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1}')

注意:我将它们插入随机时间戳顺序,以表明SQL Server将群集他们

Note: i insert them in random timestamp order, to illustrate that SQL Server will cluster them.

获取行回来看看他们是什么样的顺序在顺序(时间标记)命令:

Get the rows back and see what order they're in sequential (timestamp) order:

SELECT * FROM #uuidOrderingTest

uuid
------------------------------------
1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D866-63D1-11E1-80DB-B8AC6FBE26E1

现在可以插入GUID的搭配:

Now lets insert guid's with:


  • 相同的时间戳

  • 但不同的节点(即MAC地址):

  • the same timestamps
  • but different node (i.e. MAC address):

这是一个不一样的计算机将新的GUID:

Insert the new guids from a "different" computer:

INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D866-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D862-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D861-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85E-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D864-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D863-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85F-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85D-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D865-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D860-63D1-11E1-80DB-123456789ABC}')

和得到的结果:

uuid
------------------------------------
1BE8D85D-63D1-11E1-80DB-123456789ABC
1BE8D85E-63D1-11E1-80DB-123456789ABC
1BE8D85F-63D1-11E1-80DB-123456789ABC
1BE8D860-63D1-11E1-80DB-123456789ABC
1BE8D861-63D1-11E1-80DB-123456789ABC
1BE8D862-63D1-11E1-80DB-123456789ABC
1BE8D863-63D1-11E1-80DB-123456789ABC
1BE8D864-63D1-11E1-80DB-123456789ABC
1BE8D865-63D1-11E1-80DB-123456789ABC
1BE8D866-63D1-11E1-80DB-123456789ABC
1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D866-63D1-11E1-80DB-B8AC6FBE26E1

所以你有它。 SQL Server的订单的节点之前的时间戳。从不同的机器上创建的UUID不会群集在一起。会更好,如果它没有这样做,但干麻要怎么做。

So there you have it. SQL Server order's Node before Timestamp. Uuid created from different machines will not be clustered together. Would have been better if it hadn't done so, but whatcha gonna do.

这篇关于顺序的GUID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆