[英]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.