Comment trouver la validité du hashcode?
Question
Dans notre application, nous générons le hashcode à partir d'un objet java et le stockons dans la base de données à un certain niveau. Maintenant, mes questions sont les suivantes: si quelqu'un génère un nombre à la main, y a-t-il moyen de savoir s'il s'agit d'un hashcode valide créé par la machine virtuelle Java à partir d'un objet et non créé manuellement.
La solution
Si vous souhaitez conserver une "signature" de votre objet dans la base de données, utilisez une fonction différente. hashCode n'est pas conçu pour être difficile à deviner ou à faire de l'ingénierie inverse.
puisque vous avez utilisé hashCode, je suppose que vous ne vous souciez pas d'avoir le même F (X) = F (Y) où X et Y sont des objets différents.
si tel est bien le cas, envisagez d'utiliser une fonction de hachage, peut-être en plus de "secret". sel. par exemple:
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");
}
Autres conseils
Non, il n'y en a pas - du moins si cela tombe dans la plage de int
. Any int est un hashcode valide. En particulier, pour toute valeur int x, le hachage de new Integer (x) == x
.
Je dirais cependant que stocker les codes de hachage Java des objets n’est généralement pas une bonne idée - c’est acceptable si l’algorithme de hachage est spécifié et ne changera jamais - mais sinon, vous vous posez des problèmes changements d'algorithme et aucun de vos hachages ne correspond plus.
Non. L'opération de base hashCode () est libre de renvoyer n'importe quel int, à condition que ce soit cohérent. Je pense que la vraie question est qu'est-ce que vous essayez de faire?
il n'y a aucun moyen de trouver cela en tant que tel.