0

このアプリケーションでは、Javaオブジェクトからハッシュコードを生成し、それをデータベースのあるレベルに格納します。ここで私の質問は、誰かが手動で数値を生成するかどうかです。それがオブジェクトからJVMによって作成された有効なハッシュコードであり、手動で作成されたものではないかどうかを確認する方法はありますか。

4

4 に答える 4

3

いいえ、ありません - 少なくとも の範囲内にある場合int任意の int が有効なハッシュコードです。特に、任意の int 値 x のハッシュはnew Integer(x) == x.

ただし、オブジェクトの Java ハッシュ コードを格納することは、一般的には良い考えではありません。ハッシュ アルゴリズムが指定されていて、決して変更されない場合は問題ありませんが、それ以外の場合は、アルゴリズムが変更され、あなたのハッシュはもう一致しません。

于 2009-09-16T14:31:42.450 に答える
3

オブジェクトの「署名」をデータベースに保持したい場合は、別の関数を使用してください。hashCode は、推測やリバース エンジニアリングが困難になるようには設計されていません。

hashCode を使用したので、X と Y が異なるオブジェクトである同じ F(X) = F(Y) を持つことは気にしないと思います。

これが実際に当てはまる場合は、ハッシュ関数を使用することを検討してください。さらに、「秘密の」ソルトを追加することもできます。例えば:

public static String signature(Object o)
{
    StringBuffer sb = new StringBuffer();
    try
    {
        MessageDigest md5 = MessageDigest.getInstance("md5");
        String st = "SECRET!!1" + o.hashCode();
        md5.update(st.getBytes());
        sb.append(getHexString(md5.digest()));
    }
    catch (NoSuchAlgorithmException e)
    {
        throw new RuntimeException("bah");
    }
    catch (UnsupportedEncodingException e)
    {
        throw new RuntimeException("bah2");
    }
    return sb.toString();
}

static final byte[] HEX_CHAR_TABLE =
{
        (byte) '0', (byte) '1', (byte) '2', (byte) '3', 
        (byte) '4', (byte) '5', (byte) '6', (byte) '7', 
        (byte) '8', (byte) '9', (byte) 'a', (byte) 'b',
        (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f'
};

public static String getHexString(byte[] raw) throws UnsupportedEncodingException
{
    byte[] hex = new byte[2 * raw.length];
    int index = 0;

    for (byte b : raw)
    {
        int v = b & 0xFF;
        hex[index++] = HEX_CHAR_TABLE[v >>> 4];
        hex[index++] = HEX_CHAR_TABLE[v & 0xF];
    }
    return new String(hex, "ASCII");
}
于 2009-09-16T14:45:37.850 に答える
1

これをそのまま見つける方法はありません。

于 2009-09-16T15:16:13.487 に答える
1

いいえ。基本的な hashCode() 操作は、一貫性があれば任意の int を自由に返すことができます。本当の問題は、何をしようとしているのかということだと思います。

于 2009-09-16T14:32:36.957 に答える