什么是快速散列,它将 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.
- 将 UUID 转换为 Quadruple-precision floating point number
- 使用立体投影将浮点数映射到单位球面。
- 将点在单位球体上的极角从 [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);
可能,您必须使用字符大小写(在转换为数字之前转换为小写),还需要使用大的小数除法参数(比例、舍入模式),但主要思想在上面的代码中给出。
我希望在应用程序的热路径上将 UUID 散列到单位间隔。
这听起来像是应该已经有效解决的问题,但我的搜索还没有找到解决方案。有谁知道(并参考了示例实现)uuid 到单位间隔的 quick/efficient 散列(很明显,同时尽可能多地保留它们的随机分布)。
一个标准UUID is just a 128-bit value. You could map that to the unit interval via a stereographic projection.
- 将 UUID 转换为 Quadruple-precision floating point number
- 使用立体投影将浮点数映射到单位球面。
- 将点在单位球体上的极角从 [0, 2 π] 缩放到 [0,1]
投影方程是非线性的,因此您在进行转换时必须小心精度损失。我不知道你用什么语言实现这个,但是 Boost 有一个库可以进行高精度数学运算。
此方法通过将每个大数一对一双射到 [1/maxUUID,1]
.
去除连字符后,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);
可能,您必须使用字符大小写(在转换为数字之前转换为小写),还需要使用大的小数除法参数(比例、舍入模式),但主要思想在上面的代码中给出。