将哈希码转换为有限的字符串集

时间:2012-10-07 07:44:32

标签: java string hashcode

我知道它是单向函数,但我想将hashcode转换回有限的字符串集(使用32到126之间的char)。有没有一种有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

这不仅是可行的 - 考虑到String.hashCode的定义,它实际上非常简单。您可以创建一个带有一些任意起点的“基本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);
    }
}

答案 1 :(得分:0)

  

实际上,我只需要该哈希码中的一个字符串。我想让Minecraft种子缩短。

int值转换为短字符串的最简单方法是使用

String s = Integer.toString(n, 36); // uses base 36.