2

私はそれが一方向関数であることを知っていますが、ハッシュコードを文字列の制限されたセットに変換したいと思います (32 から 126 までの char を使用)。これを行う効率的な方法はありますか?

4

2 に答える 2

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);
    }
}
于 2012-10-07T08:07:29.430 に答える
0

実際には、そのハッシュコードから 1 つの文字列だけが必要です。マインクラフトのシードショートナーを作りたいです。

int値を短い文字列に変換する最も簡単な方法は、

String s = Integer.toString(n, 36); // uses base 36.
于 2012-10-07T07:57:48.533 に答える