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