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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top