所以我知道我可以简单地通过执行.hashCode()将字符串转换为哈希码,但是有没有一种方法可以转换(或使用其他函数,如果有一个),而不是返回一个整数返回0到1之间的双倍?我想把数字除以最大可能的整数,但不确定是否有更好的方法。
*编辑(有关我为什么要这样做的更多信息):我正在进行数学运算,我正在尝试将不同的对象分组以在其组中执行相同的数学运算但具有不同的参数进入功能。每个成员都有一个特征列表,将它们“分组”......所以我想把这些特征放入一个字符串然后对其进行哈希编码并从中找到它们的组值
答案 0 :(得分:6)
你不能只划分Integer.MAX_VALUE
,因为这不会处理负数。你可以使用:
private static double INTEGER_RANGE = 1L << 32;
...
// First need to put it in the range [0, INTEGER_RANGE)
double doubleHash = ((long) text.hashCode() - Integer.MIN_VALUE) / INTEGER_RANGE;
据我所知,这应该没问题......但我不打算对发行做出任何声明。可能有一种相当简单的方法可以使用32位在正确的范围内创建一个唯一的双精度(每个唯一的哈希码),但如果你不太关心它,这将更简单。
答案 1 :(得分:1)
划分它应该没问题,但是由于四舍五入的问题等,你可能会失去一些“精确度”,这可能是双倍的。
一般来说,哈希用于识别试图确保它是唯一的东西,失去精确度可能会有问题。
您可以编写自己的String.hashCodeDouble(),返回所需的数字,可能使用常见的哈希算法(比方说,MD5)并使其适应您所需的响应范围。
示例:执行String的MD5以获取哈希值,然后只需在其前面放置一个 0。 ...
请记住.hashCode()在Java中的许多函数中使用,你不能简单地覆盖它。
答案 2 :(得分:1)
这闻起来很糟糕但可能会做你想要的:
Integer iHash = "123".hashCode();
String sHash = "0."+iHash;
Double dHash = Double.valueOf(sHash);