2009-09-16 8 views
0

Dans notre application, nous générons un code hash à partir d'un objet java et le stockons dans la base de données à un certain niveau. Maintenant, mes questions sont si quelqu'un génère un nombre à la main, est-il possible de savoir s'il s'agit d'un hashcode valide créé par la JVM à partir d'un objet et non créé manuellement à la main.Comment trouver la validité du hashcode?

+0

Ne le pensez pas. Vous pouvez même remplacer l'implémentation du hashcode par défaut, mais vous ne saurez jamais s'il a été créé par votre code (ou JVM d'ailleurs) ou créé manuellement. – wtaniguchi

Répondre

3

Si vous souhaitez conserver une 'signature' de votre objet dans la base de données, utilisez une autre fonction. 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 c'est effectivement le cas, pensez à utiliser une fonction de hachage, peut-être plus un sel "secret". 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"); 
} 
+0

Merci Omry. C'est quelque chose que je pensais aussi, merci de partager le code. – Rajat

3

Non, il n'y a pas - au moins si elle se situe dans la plage int. Tout 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 d'objets n'est généralement pas une bonne idée - c'est correct si l'algorithme de hachage est spécifié et ne changera jamais, mais sinon vous demandez des ennuis quand l'algorithme change et aucun de vos hashs ne correspond plus.

1

Non. L'opération de base hashCode() est libre de renvoyer tout int, à condition qu'il soit cohérent. Je pense que la vraie question est ce que vous essayez de faire?

1

il n'y a pas moyen de trouver cela comme tel.

Questions connexes