math - 如何将 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 的函数?
解决方案
如果 N 是 2 的幂,那么解决方案很明显:您可以在位边界上拆分,就像问题中的 16 个桶一样。
如果 N 不是 2 的幂,则从数学上讲,桶的大小不可能完全相等,因此问题就变成了您愿意以效率的名义容忍多大的不平等。
只要 N<2^24 左右,最简单的做法就是根据前 32 位将 UUID 分配到 N 个大小为 2^32/N 的桶中。对于大多数应用程序来说,这应该足够快且足够相等,如果 N 需要大于允许的值,您可以轻松地将位加倍,但代价很小。
推荐阅读
- javascript - 在带有 javascript 或其他方式的闪亮应用程序中使用鼠标即时调整 DT::datatable() 列大小
- php - Woocommerce 在结帐时禁用运输选项方法
- python - QVideoWidget 内容未从小部件中获取
- python - 使用 python webdriver 打印不是常规字符串的元素
- r - 对范围为 [0, 1] 的变量进行对数转换
- server - 设置云服务器
- swift - 关闭“viewDidLoad”上的键盘
- python - 函数中的所有 return 语句都应该返回一个表达式,或者它们都不应该
- javascript - React / Javascript按钮onClick不起作用
- javascript - 如何将表单从谷歌验证码 v2 升级到验证码 v3