C# 我自己生成一个顺序guid

C# 我自己生成一个顺序guid,c#,ravendb,C#,Ravendb,可能重复: 我得到了一些文件,这些文件可能存储在raven中。我想为它们生成一个连续的GUID(我在RavenDB.net上看到raven使用它们) 是否有一个ravendbapi可以用来生成id 请注意,这个问题是特定于RavenDB的通常,如果您使用的是GUID值,就不会担心它们是连续的 将为您提供可直接使用的唯一值 如果确实需要顺序值,可以使用接受整数类型的,并按顺序递增构建值。然而,这将是非常不寻常的。这不是常见的请求:创建一个顺序的GUID,因为根据定义,GUID是唯一的(尽可能多)

可能重复:

我得到了一些文件,这些文件可能存储在raven中。我想为它们生成一个连续的GUID(我在RavenDB.net上看到raven使用它们)

是否有一个ravendbapi可以用来生成id


请注意,这个问题是特定于RavenDB的

通常,如果您使用的是GUID值,就不会担心它们是连续的

将为您提供可直接使用的唯一值


如果确实需要顺序值,可以使用接受整数类型的,并按顺序递增构建值。然而,这将是非常不寻常的。

这不是常见的请求:创建一个顺序的
GUID
,因为根据定义,
GUID
是唯一的(尽可能多),并且一些数学的、可预测的序列的存在将在其唯一性支持中引入额外的问题

但是,顺便说一句,像往常一样,总有人已经在考虑这个问题了

这个链接上的那个家伙似乎也有同样的问题:

注:提供的代码是针对
C#2005
,但此后没有太大变化,至少在这个问题上没有太大变化

编辑

根据文档,关于顺序GUID生成:

支持数字或Guid Id属性,它们可以无缝工作。 在这种情况下,RavenDB将自动在 实体中显示的数字或Guid值的内部字符串ID 然后回来

使用这种方法,ID在调用Store后立即可用 在对象上-RavenDB会话将在内存中设置唯一的ID 没有要求发球的人


这意味着,即使它是由“服务器”生成的,它也存储在内存中,因此请求它几乎不需要任何成本,如果这是您的警惕…

下面的代码显示了RavenDB如何在ETAG服务器上实现这一点,您可以在上下文中看到它。代码的另一部分是


我不认为这可以通过API访问,因为这是一个内部细节,但是您可以自己实现类似的东西。基本上,它依赖于拥有一个全局计数器(
currentEtagBase
sequentialUuidCounter

GUID按定义不连续。@ChrisGessler:不重复。我问过拉文德的事implementation@jgauffin:是否要在数据库端生成,因为根据帖子,设置
idColumn=null
,就足够了?@Tigran:文档可能已存储。我想生成密钥front@jgauffin:本文中描述的实体不是guid。它们看起来就像guid,仅此而已。带有顺序部分的全局唯一标识符并不是什么新鲜事。例如,它们存在于SqlServer中,加快了查找速度siginifically@jgauffin是的,但它们通常在插入时自动生成。手动创建新的顺序值并不常见,这就是我为什么问的原因。我希望能够使用ravendbs实现,然后在github上检查代码。它不是开源的吗?@jgauffin我对Raven的理解是,您只需将它保留为
Guid.Empty
,当您调用
Store
时,Raven会给您一个正确的Guid。您通常不提供自己的。。。
public Guid CreateSequentialUuid()
{
    var ticksAsBytes = BitConverter.GetBytes(currentEtagBase);
    Array.Reverse(ticksAsBytes);
    var increment = Interlocked.Increment(ref sequentialUuidCounter);
    var currentAsBytes = BitConverter.GetBytes(increment);
    Array.Reverse(currentAsBytes);
    var bytes = new byte[16];
    Array.Copy(ticksAsBytes, 0, bytes, 0, ticksAsBytes.Length);
    Array.Copy(currentAsBytes, 0, bytes, 8, currentAsBytes.Length);
    return bytes.TransfromToGuidWithProperSorting();
}