C# 更改GUID中的两个字节

C# 更改GUID中的两个字节,c#,azure-cosmosdb,guid,data-partitioning,C#,Azure Cosmosdb,Guid,Data Partitioning,我使用的是分区CosmosDb,但我不知道每次我想通过id获取资源时分区键的值。现在使用id作为分区键对我来说不是一个解决方案,因为它会花费太长的时间并占用太多的空间(我听说分区键的最大数量是10GB,但我有更多的方法) 我的想法是操作2个字节的GUID,以便将分区键值映射到每个GUID。这样我就不必使用跨分区查询,而是可以很容易地从GUID中获取分区键值。GUID中是否有我无法更改的保留字节?对于这个问题有什么最好的解决方法吗 GUID中有一个基于时间的组件,您可以对其进行更改,如果您了解其后

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


我的想法是操作2个字节的GUID,以便将分区键值映射到每个GUID。这样我就不必使用跨分区查询,而是可以很容易地从GUID中获取分区键值。GUID中是否有我无法更改的保留字节?对于这个问题有什么最好的解决方法吗

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

有关章节内容如下:

基于时间的guid(版本1)基于时间的guid是变体2,版本1 RFC4122 GUID,也称为“顺序GUID”,因为它们可以 生成的值彼此非常接近。它们由三部分组成 变量和版本之外的字段:一个60位UTC时间戳,一个 14位时钟序列和48位节点标识符

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

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

时钟序列字段初始化为随机值,然后 自 上次生成的GUID(例如,如果计算机使用 时间服务器,或者如果它丢失了日期并认为是1980年)。这允许 16384时钟复位,无任何碰撞危险。如果guid 生成速度如此之快,以至于系统时钟没有移动 从最后一个GUID的时间戳开始转发,然后生成GUID 算法通常会暂停,直到系统时钟增加 时间戳

顺序guid实际上不是顺序的。在正常情况下,, 由同一台计算机生成的guid将逐渐减少 增加时间戳字段(剩余其他字段) 常数)。但是,时间戳字段不在 GUID的最低有效位位置,因此如果处理GUID 作为一个128位的数字,它实际上并不递增

重要的是要注意的是,序列碰撞的可能性 guid非常小。时钟序列和时间戳几乎相同 当然,唯一地标识时间点和节点标识符 几乎可以肯定的是,它确定了一个唯一的来源

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

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


guid通过其构造保证其唯一性。如果您使用GUID并更改了一些字节,您就不能再依靠它们的构造来保证唯一性了。@Damien_不信者,即使我只更改了2个字节?很明显,它不如原来的GUID好,但是它有那么大的区别吗?你是说它需要太长时间?使用id作为partitionkey是可以的,只要您知道每次都是。每个分区只有10GB的限制。键值。你永远不会达到这个目标,因为每个分区只有一个值。你只需将分区键添加到id中,并按照规范保持GUID的干净。例如:“mypk1292fc117f-B8EB-4CB0-920D-73AC3711958D”。@nickchapsa我的意思是“它花费的时间太长”:在逻辑分区内搜索比搜索所有资源要高效得多。您还可以通过存储过程在分区内执行事务。因此,最好有逻辑分区。