自己生成一个顺序guid

时间:2012-09-03 18:25:14

标签: c# ravendb

  

可能重复:
  Sequential Guid Generator C#

我收到了可能存储在乌鸦中的文件。我想为它们生成一个顺序GUID(我在RavenDB.net上看到raven使用它们)。

我是否可以使用ravendb API来生成ID?

请注意,问题是特定于RavenDB

3 个答案:

答案 0 :(得分:3)

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

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();
}

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

答案 1 :(得分:0)

通常情况下,如果您使用的是GUID值,则不必担心它们是顺序

Guid.NewGuid将为您提供可以直接使用的唯一值。

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

答案 2 :(得分:0)

这不是通常的请求:创建顺序 GUID,按照定义,GUID是唯一的(尽可能多)并且存在一些数学,可预测的序列将在其唯一性支持中引入其他问题。

但是,顺便说一下,像往常一样,总有人会考虑这个

似乎此链接上的人遇到了同样的问题:

Generate Sequential GUID

注意:提供的代码适用于C# 2005,但至少在此问题上没有太大变化,至少就此问题而言。

编辑

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

  

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

     

使用此方法,在调用Store后立即可以使用ID   在对象上 - RavenDB会话将在内存中设置唯一的ID   没有问服务员

这意味着即使它是由“服务器”生成的,它也存储在内存中,所以要求它几乎不需要任何费用,如果这是你的烦恼......