在GUID中更改两个字节

时间:2019-03-18 15:25:42

标签: c# azure-cosmosdb guid data-partitioning

我正在使用分区的CosmosDb,但是每次我想通过其ID获取资源时,我都不知道分区键的值。现在,将id用作分区键对我来说不是一个解决方案,因为它会花费很长时间并且占用太多空间(我听说分区键的最大数量为10GB,但我有更多的方法。)

我的想法是操纵2个字节的GUID,以便将分区键值映射到每个guid。这样,我不必使用跨分区查询,而是可以轻松地从GUID获取分区键值。在GUID中是否有我无法更改的保留字节?是否有针对此问题的最佳实践?

1 个答案:

答案 0 :(得分:2)

GUID中有一个基于时间的组件,您可以更改该组件,如果您了解其后果,则不会导致冲突。您可以在这里阅读一些想法:

https://blog.stephencleary.com/2010/11/few-words-on-guids.html

相关章节为:

  

基于时间的GUID(版本1)基于时间的GUID是变体2,版本1   RFC 4122 GUID,也称为“顺序GUID”,因为它们可以是   生成的值彼此非常接近。他们包括三个   除了“版本”和“版本”以外的其他字段:60位UTC时间戳,   14位时钟序列和48位节点标识符。

     

节点标识符通常是计算机的MAC地址   生成基于时间的GUID(保证是唯一的,   因为MAC地址使用注册系统)。但是,也可能   是一个47位随机值(设置了广播位)。在这种情况下,   与真实的MAC地址没有冲突的危险,因为   物理MAC地址的广播位始终为0。存在危险   与其他随机节点标识符的冲突;特别,   1379万个随机节点有50%的碰撞机会   进入网络。

     

注意:当前不是使用随机值代替MAC地址   由Microsoft的Win32 API支持。这意味着任何GUID   使用UuidCreateSequential完成的生成将公开MAC   地址。

     

“时钟序列”字段被初始化为随机值,并且   自从   最后生成的GUID(例如,如果计算机使用   时间服务器,或者如果它丢失了日期并认为是1980年)。这允许   16,384个时钟复位,没有任何碰撞危险。如果GUID   生成速度如此之快,以致系统时钟没有移动   从上一个GUID的时间戳记开始向前移动,然后生成GUID   算法通常会停止运行,直到系统时钟增加   时间戳。

     

顺序GUID实际上不是顺序的。在正常情况下   由同一台计算机生成的GUID将逐步   增加时间戳字段(其余字段保留)   不变)。但是,时间戳字段不在   GUID的最低有效位位置,因此如果对GUID进行了处理   作为128位数字,实际上并不会增加。

     

请务必注意,相继碰撞的可能性   GUID非常小。时钟序列和时间戳几乎   当然唯一地标识一个时间点,以及节点标识符   几乎可以确定唯一的来源。

     

可以通过Win32函数创建顺序的GUID   UuidCreateSequential或通过使用Windows SDK中的uuidgen.exe   传递-x参数。

您也可以在此处查看相关规范:

https://tools.ietf.org/html/rfc4122#section-4.1.1