可能重复:
顺序 Guid 生成器 C#
我得到了可能存储在 raven 中的文件。我想为它们生成一个顺序 GUID(我在 RavenDB.net 上看到 raven 使用它们)。
是否有我可以用来生成 id 的 ravendb API?
请注意,问题是 RavenDB 特定的
可能重复:
顺序 Guid 生成器 C#
我得到了可能存储在 raven 中的文件。我想为它们生成一个顺序 GUID(我在 RavenDB.net 上看到 raven 使用它们)。
是否有我可以用来生成 id 的 ravendb API?
请注意,问题是 RavenDB 特定的
下面的代码显示了 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 访问,因为它是一个内部细节,但您可以自己实现类似的东西。基本上它依赖于拥有一个全局计数器(currentEtagBase
和sequentialUuidCounter
)。
通常,如果您使用 GUID 值,则不必担心它们是连续的。
Guid.NewGuid
将为您提供可以直接使用的独特值。
如果您确实需要顺序值,可以使用接受整数类型的Guid 构造函数,并构建顺序递增的值。然而,这将是非常不寻常的。
这不是通常的要求:根据定义,创建一个序列 是唯一的(尽可能),并且一些数学的、可预测的序列的存在将在其唯一性支持中引入额外的问题。GUID
GUID
但是,顺便说一句,像往常一样,总是有人已经在考虑这个问题。
似乎这个链接上的那个人有同样的问题:
注意:提供的代码是针对 的C# 2005
,但至少在这个问题上没有太大变化。
编辑
根据文档,关于顺序 GUID 生成:
支持数字或 Guid Id 属性并将无缝工作。在这种情况下,RavenDB 会自动将内部字符串 ID 转换为实体中显示的数字或 Guid 值并返回。
使用这种方法,ID 在对象上调用 Store 后立即可用 - RavenDB 会话将在内存中设置一个唯一的 ID,而无需从服务器询问
这意味着即使它是由“服务器”生成的,它也存储在内存中,所以请求它几乎不会花费任何成本,如果这是你的谨慎...