2

この質問が本当に変な場合は、事前に申し訳ありません。重複データを送信したくないキューにデータを送信しています。プログラムには重複データ項目を防ぐ方法がなく、それらを受け入れるだけですが、キューIDは一意である必要があり、自分で指定できます。そのため、送信するデータに基づいてIDを生成するようにしたいと思います。

2つの文字列があるとします。

hello, SO how are you? //base case
hello, SO how are you? //same
hello, SO how are You? //different, notice the capital Y
What up, SO! //completely different

上記の最初の2つの文字列に一致するが、他の2つを一意にするJavaで何に変換できますか?私はこれまであまり試していませんが(変換するのに最適なものが正確にわからないため)、少し遊んでみましGZIPOutputStreamたが、サイズは似ているようで、それかどうかはわかりませんでした最も効率的でした(つまり、クレイジーな16進文字などの最小サイズ)。

誰かが私が求めていることを理解してくれることを願っていますが、そうでない場合は私に知らせてください。私は明確にするために最善を尽くします。

編集:申し訳ありませんが、文字列用のものが必要なだけでなく、リスト(およびおそらく辞書)も扱っています。ごめんなさい

ありがとう

コード:

public class hashtest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        convert("hello world"); //same
        convert("hello world"); //same

        convert("hello world!"); //exclamation mark
        convert("hello World"); //capital W

        convert_list(new int[] {5, 2, -3}); //same
        convert_list(new int[] {5, 2, -3}); //same
        convert_list(new int[] {5, 3, -3}); //different
        convert_list(new int[] {5, 2, -4}); //different

    }

    private static void convert_list(int[] is) {
        // TODO Auto-generated method stub
        System.out.println("word is " + is);
        System.out.println("hashcode is " + is.toString());
        System.out.println("****");
    }

    private static void convert(String string) {
        // TODO Auto-generated method stub
        System.out.println("word is " + string);
        System.out.println("hashcode is " + string.hashCode());
        System.out.println("****");
    }

}
4

2 に答える 2

3

自分自身をキューIDとして使用するか、使用Stringが必要な場合 (同じ文字に対して同じ値を返す)IntegerString.hashCode()hashCode()

編集:

オブジェクトが実際には文字列ではない場合、最善のアプローチは独自のhashCode()メソッドを実装することです。または、「迅速で汚い」場合は、単純に文字列としてレンダリングし(一意のビットから一意の文字列を構成します)、その上で文字列のhashCode()を呼び出すことができます。

編集済み(詳細):

問題は.toString()、配列のを使用していることです。これは、Javaでは配列クラスに実装されていないため、内容が同じであっても、すべての配列に固有のObjectの実装にフォールバックします。

幸い、JDKは答えを提供しました:ユーティリティメソッドを使用するArrays.toString()

private static void convert_list(int[] is) {
    // TODO Auto-generated method stub
    System.out.println("word is " + is);
    System.out.println("hashcode is " + Arrays.toString(is));
    System.out.println("****");
}
于 2012-04-14T16:31:09.987 に答える
1

だけでなく機能するものが必要な場合は、 SHA-1アルゴリズムStringを選択できます。

Javaでは、このように使用できます

MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
byte[] buf = crypt.digest("hello, SO how are you?".getBytes());

これはbytes配列で機能するため、byte[]で型を変換して使用できます。

結果byte[]の長さは20になります。したがって、元のデータの長さが20バイトを超える場合は適切な選択です。

そして、2つの異なる入力が同じ結果を生成する確率については、この投稿を読んでください。または、Webでより技術的な資料を検索してください。いずれにせよ、確率は非常に低いです。

于 2012-04-14T17:05:18.427 に答える