首页 > 解决方案 > 如何将 UUID 空间划分为 N 个大小相等的分区?

问题描述

采用十六进制表示的 UUID:'123e4567-e89b-12d3-a456-426655440000'

我有很多这样的 UUID,我想将它们分成 N 个存储桶,其中 N 是我选择的,我想生成这些存储桶的边界。

我可以用这些界限轻松创建 16 个存储桶:

00000000-0000-0000-0000-000000000000
10000000-0000-0000-0000-000000000000
20000000-0000-0000-0000-000000000000
30000000-0000-0000-0000-000000000000
...
e0000000-0000-0000-0000-000000000000
f0000000-0000-0000-0000-000000000000
ffffffff-ffff-ffff-ffff-ffffffffffff

只需遍历第一个十六进制数字的选项即可。

假设我想要 50 个大小相等的存储桶(就每个存储桶中包含的 UUID 可能性的数量而言相等),或者 2000 个存储桶,或者 N 个存储桶。

如何生成这样的边界作为 N 的函数?

标签: mathhexuuidpartitioning

解决方案


如果 N 是 2 的幂,那么解决方案很明显:您可以在位边界上拆分,就像问题中的 16 个桶一样。

如果 N 不是 2 的幂,则从数学上讲,桶的大小不可能完全相等,因此问题就变成了您愿意以效率的名义容忍多大的不平等。

只要 N<2^24 左右,最简单的做法就是根据前 32 位将 UUID 分配到 N 个大小为 2^32/N 的桶中。对于大多数应用程序来说,这应该足够快且足够相等,如果 N 需要大于允许的值,您可以轻松地将位加倍,但代价很小。


推荐阅读