簡體   English   中英

如何找到哈希碼的有效性?

[英]How to find hashcode validity?

在我們的應用程序中,我們從Java對象生成哈希碼,並將其存儲在數據庫中的某個級別。 現在我的問題是是否有人手工生成一個數字,有沒有辦法我可以確定它是否是由JVM從對象創建的有效哈希碼,而不是手動創建的。

不,沒有-至少在int范圍內。 任何 int是有效的哈希碼。 特別是,對於任何int值x, new Integer(x) == x的哈希。

不過,我要說的是,存儲對象的Java哈希碼通常不是一個好主意-如果指定了哈希算法並且永遠不會更改,這是可以的-但否則,當算法更改並您的哈希不再匹配。

如果要在數據庫中保留對象的“簽名”,請使用其他函數。 hashCode的設計不容易引起猜測或逆向工程。

因為您使用了hashCode,所以我假設您不關心具有相同的F(X)= F(Y),其中X和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");
}

不需要。基本的hashCode()操作可以自由返回任何int,只要它是一致的。 我認為真正的問題是您要做什么?

沒有辦法找到這樣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM