Java:对象加倍"哈希"在[0,1)上均匀分布的函数

时间:2014-09-30 12:17:34

标签: java random distribution hashcode

我试图构建或找到一个将java对象作为输入并在[0,1)间隔中返回double值的函数。 " hash"的加密安全性(单向函数,无碰撞)功能不是我的主要想法。我只想要在0和1之间均匀分布的double值。

我无法使用Math.random或Random等函数或类,因为这会为同一输入返回不同的结果。

到目前为止,我最好的方法是使用Object.hashCode()方法并将返回的int值分解为介于0和1之间的两倍。不幸的是,结果值的分布不是很均匀。很多值介于0.1和0.3之间。我想hashCode()方法并不是一成不变的。

关于如何改进我的方法或更好的方法的任何想法?

2 个答案:

答案 0 :(得分:0)

如果

,您实际上可以使用随机数
  • 它们与对象一起存储在全局可访问的地图中,或传递给需要生成双“哈希”值的所有人
  • 确保在地图中查找每个对象,并且仅针对尚未存在的对象生成新值。

(您可能希望将该映射和查找/生成逻辑包装在自己的类中。)

答案 1 :(得分:0)

你的问题中有几点需要注意。

<强>第一

  

我不能使用像Math.random或Random这样的函数或类   会为同一输入返回不同的结果。

您可以将Math.Random与已知种子一起使用。

Random generator = new Random(seed);
double random = generator.nextDouble();

<强>第二

你提到了

  

到目前为止,我最好的方法是使用Object.hashCode()方法和   将返回的int值降低到0到1之间的两倍。   不幸的是,结果值的分布不是很明显   均匀。很多值介于0.1和0.3之间。我想是的   hashCode()方法并不是一成不变的。

这意味着输入的分布使得.hashCode()返回0.1到0.3之间的值。在您的情况下,您想要使用的散列函数将取决于输入。

可能做什么

  • 查看输入的分布以确定散列函数。
  • 众所周知,
  • Murmurhash在哈希统一分布方面效果很好。检查它是否适用于您的情况。
  • 如果所有其他方法都失败了,请创建与此StackExchange post中讨论的类似的自定义哈希函数。