我知道这是单向函数,但我想将哈希码转换回有限的字符串集(使用 32 到 126 之间的字符)。有没有一种有效的方法来做到这一点?
问问题
4097 次
2 回答
4
这不仅可行——考虑到String.hashCode
. 您可以创建一个带有任意起点的“base 31”字符字符串,以将所有内容保持在正确的范围内,并根据该起点减去偏移量。
这不一定是给定哈希码的最短字符串,但 7 个字符很短:)
public class Test {
public static void main(String[] args) {
int hash = 100000;
String sample = getStringForHashCode(hash);
System.out.println(sample); // ASD^TYQ
System.out.println(sample.hashCode()); // 100000
}
private static final int OFFSET = "AAAAAAA".hashCode();
private static String getStringForHashCode(int hash) {
hash -= OFFSET;
// Treat it as an unsigned long, for simplicity.
// This avoids having to worry about negative numbers anywhere.
long longHash = (long) hash & 0xFFFFFFFFL;
System.out.println(longHash);
char[] c = new char[7];
for (int i = 0; i < 7; i++)
{
c[6 - i] = (char) ('A' + (longHash % 31));
longHash /= 31;
}
return new String(c);
}
}
于 2012-10-07T08:07:29.430 回答
0
实际上,我只需要该哈希码中的一个字符串。我想制作 Minecraft 种子缩短器。
将int
值转换为短字符串的最简单方法是使用
String s = Integer.toString(n, 36); // uses base 36.
于 2012-10-07T07:57:48.533 回答