Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';这是一个快速散列,它将UUID映射到单位间隔?_Java_Optimization_Hash_Uuid - Fatal编程技术网

Java 什么';这是一个快速散列,它将UUID映射到单位间隔?

Java 什么';这是一个快速散列,它将UUID映射到单位间隔?,java,optimization,hash,uuid,Java,Optimization,Hash,Uuid,我希望在应用程序的热路径上将UUID散列到单位间隔 这听起来像是应该已经有效解决的问题,但我的搜索还没有找到解决方案。是否有人知道(并参考了示例实现)uuid到单位间隔的快速/高效散列(显然,同时尽可能保留其随机分布)。标准只是一个128位的值。你可以通过一个函数将其映射到单位间隔 将UUID转换为 使用赤平投影将浮点数映射到单位球体 将单位球体上点的极角从[0,2π]缩放到[0,1] 投影方程是非线性的,因此在进行变换时必须小心精度损失。我不知道您正在实现的是哪种语言,但有一个用于进行高精度数

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

这听起来像是应该已经有效解决的问题,但我的搜索还没有找到解决方案。是否有人知道(并参考了示例实现)uuid到单位间隔的快速/高效散列(显然,同时尽可能保留其随机分布)。

标准只是一个128位的值。你可以通过一个函数将其映射到单位间隔

  • 将UUID转换为
  • 使用赤平投影将浮点数映射到单位球体
  • 将单位球体上点的极角从[0,2π]缩放到[0,1]
  • 投影方程是非线性的,因此在进行变换时必须小心精度损失。我不知道您正在实现的是哪种语言,但有一个用于进行高精度数学运算的库。

    此方法通过在
    [1/maxUUID,1]
    之间的间隔上,将每个大数对相应的浮点数进行一对一的双射来保持UUID的“唯一性级别”

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


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

    通过“单位间隔”,您的意思是浮点数的范围在0.0-1.0之间吗?从UUID创建一个52位整数散列。或者将值
    0x3ff0000000000000
    转换为双精度-这将为您提供一个范围为1.0-2.0的数字。从中减去1.0。请参阅,了解如何将字节数组转换为双精度数组。我在jvm上-实现哈希似乎不太困难,只是在我看来,这应该已经存在了somewhere@blueberryfields可能地我从没听说过。对我来说,散列和浮点数是完全不同的东西。一个用于识别,另一个用于计算,但有趣的是,将两者结合起来。您是希望将浮点数用作散列之类的标识符,还是仅用于可视化目的?如果你在寻找一个ID,为什么不坚持使用UUID呢?我希望两者兼而有之——我正在寻找的UUID并不是完全随机的,以图形方式显示它们有助于数据分析
    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);