1

可能重复:
顺序 Guid 生成器 C#

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

是否有我可以用来生成 id 的 ravendb API?

请注意,问题是 RavenDB 特定的

4

3 回答 3

3

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

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)。

于 2012-09-04T09:30:57.643 回答
0

通常,如果您使用 GUID 值,则不必担心它们是连续的。

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

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

于 2012-09-03T18:28:18.713 回答
0

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

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

似乎这个链接上的那个人有同样的问题:

生成顺序 GUID

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

编辑

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

支持数字或 Guid Id 属性并将无缝工作。在这种情况下,RavenDB 会自动将内部字符串 ID 转换为实体中显示的数字或 Guid 值并返回。

使用这种方法,ID 在对象上调用 Store 后立即可用 - RavenDB 会话将在内存中设置一个唯一的 ID,而无需从服务器询问

这意味着即使它是由“服务器”生成的,它也存储在内存中,所以请求它几乎不会花费任何成本,如果这是你的谨慎...

于 2012-09-03T18:30:37.003 回答