什么是快速散列,它将 UUID 映射到单位间隔?

What's a quick hash, which will map UUIDs to the unit interval?

我希望在应用程序的热路径上将 UUID 散列到单位间隔。

这听起来像是应该已经有效解决的问题,但我的搜索还没有找到解决方案。有谁知道(并参考了示例实现)uuid 到单位间隔的 quick/efficient 散列(很明显,同时尽可能多地保留它们的随机分布)。

一个标准UUID is just a 128-bit value. You could map that to the unit interval via a stereographic projection.

  1. 将 UUID 转换为 Quadruple-precision floating point number
  2. 使用立体投影将浮点数映射到单位球面。
  3. 将点在单位球体上的极角从 [0, 2 π] 缩放到 [0,1]

投影方程是非线性的,因此您在进行转换时必须小心精度损失。我不知道你用什么语言实现这个,但是 Boost 有一个库可以进行高精度数学运算。

此方法通过将每个大数一对一双射到 [1/maxUUID,1].

之间的对应浮点数来保持 UUID 的 "uniqueness level"

去除连字符后,UUID 字符串是一个简单的十六进制字符串。将其转换为 BigInt 并除以最大可能的 UUID 编号(128 位 ff...fff)。

String hexUUID = UUIDstr.replaceAll('-','');
BigDecimal uuid = new BigDecimal(new BigInteger(hexUUID , 16));
BigDecimal maximal = new BigDecimal(new BigInteger("ffff...ff",16)); // compute it only once!!
BigDecimal floatID = uuid.divide(maximal, MathContext.DECIMAL128);

可能,您必须使用字符大小写(在转换为数字之前转换为小写),还需要使用大的小数除法参数(比例、舍入模式),但主要思想在上面的代码中给出。