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?
Répondre
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");
}
Merci Omry. C'est quelque chose que je pensais aussi, merci de partager le code. – Rajat
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.
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?
il n'y a pas moyen de trouver cela comme tel.
- 1. php - vérifie la validité du guid
- 2. Git/gitose: Comment vérifier la validité du nom d'utilisateur et du courrier électronique?
- 3. Vérification de la validité du numéro de version avec Perl
- 4. Erreur sans HashCode, Eclipse
- 5. Java Array HashCode implémentation
- 6. xml validité, ajax et php
- 7. Comment trouver la position du nième jeton
- 8. Comment trouver la version du référentiel Subversion?
- 9. Le formatage css affecte-t-il la validité des formulaires
- 10. Trouver la position du curseur
- 11. Comment mieux tester la validité de XML à partir d'une méthode?
- 12. Comment trouver la version d'assemblage du programme appelant?
- 13. Comment trouver la cause des mauvaises performances du service RESTful?
- 14. Comment trouver la TabSelection
- 15. Comment trouver la fonction globale?
- 16. Jquery: Comment trouver du texte dans textarea
- 17. Groovy: générer des égaux et des méthodes hashCode
- 18. Quelle est la durée de vie et la validité des itérateurs C++?
- 19. Pourquoi GetHashCode n'est pas une propriété comme HashCode dans .NET
- 20. pourquoi la validité étendue ca ne contient pas d'information de clé privée?
- 21. Comment trouver la taille de la mémoire virtuelle et la taille du cache d'un système Linux?
- 22. Comment trouver la longueur d'un LPCSTR
- 23. Trouver la position du curseur dans un TextBox
- 24. trouver la partie du nombre entier d'un nombre
- 25. Comment trouver la véritable cause de com.sun.star.uno.RuntimeException?
- 26. SQL: Trouver les lignes où la valeur du champ diffère
- 27. Géodonnées du nom complet de la région, où trouver?
- 28. Comment trouver le nom actuel du test en cours d'exécution?
- 29. Ensembles imbriqués MySQL - Comment trouver le parent du noeud?
- 30. Comment trouver l'instance lorsque le redimensionnement du composant est terminé
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