2010-11-12 20 views
1

en Java Est-il possible d'obtenir le code de hachage cohérent pour un objet lorsque nous courons plusieurs fois l'applicationhashcode Conformément à un objet en java

+0

Cela dépend des variables membres d'une classe qui sont uniques et utilisées pour calculer le code de hachage. –

Répondre

1

Il dépend de la méthode mise en œuvre sur hashCode() d'objet

Il peut également être

public int hashCode() { 

    return 1; 

    } 
+0

Renvoyer une valeur fixe de 'hashCode()' donne de mauvaises performances sur les collections utilisant le hashcode. Par exemple. 'HashMap'. –

+0

@ michael.kebe Oui, bien sûr, je viens de dire que cela peut être aussi, juste visualiser le scénario que je n'ai pas dit de suivre :) :) –

5

Sure. Si c'est une chaîne par exemple, alors String.hashCode() donne un hashcode cohérent chaque fois que vous exécutez l'application.

Vous avez seulement des ennuis si le code de hachage incorpore autre chose que les valeurs des champs de composant de l'objet; par exemple. un hashcode d'identité. Et bien sûr, cela signifie que la classe d'objets doit surcharger Object.hashcode() à un moment donné, car cette méthode vous donne un code d'identification.

SUIVI

A en juger par les commentaires sur d'autres réponses, l'OP semble encore être la poursuite de l'objectif illusoire d'une fonction de hachage unique, c'est-à-dire une fonction qui maquettera (par exemple) n'importe quelle chaîne en un code de hachage unique pour toutes les chaînes possibles.

Malheureusement ceci est impossible dans le cas général, et dans ce cas. En outre, il est simple de construire un preuve qu'une String à int fonction de hachage qui génère des valeurs uniques int est mathématiquement impossible. (Je ne vous ennuierai pas avec les détails ... mais la base de la preuve est qu'il y a plus de valeurs String que int.)

En fait, la seule situation où une telle fonction de hachage est possible est quand l'ensemble de toutes les valeurs possibles du type d'entrée a une taille qui n'est pas supérieure au nombre de valeurs possibles du type entier. Il y a des fonctions de hachage qui tracera un byte, char, short ou int à un int unique, mais une fonction de hachage qui associe long valeurs à int uniques valeurs est impossible.

0

Non, pas pour les objets en général. Les objets avec leur propre méthode de hashcode seront probablement cohérents d'une exécution à l'autre.

0

Implémenter/remplacer la méthode public int hashCode() tous les objets ont?

0

Vous devez décider ce qui rend l'objet identique. Habituellement, il est basé sur le contenu d'un ou plusieurs champs. Dans ce cas, vous devez créer le hashCode en fonction de ces champs. (Et est égal à())

Cependant, je suggère que vous ne devriez pas compter sur le hashCode étant le même entre les exécutions de l'application. Ceci est très susceptible de casser quand vous changez le code et très dur à réparer quand il le fait. par exemple. Si vous ajoutez/supprimez un champ qui fait partie du hashCode ou changez la façon dont le hashCode est calculé ou tout ce qui dépend de ti, le hashCode changera.

Qu'essayez-vous de faire? Cela ressemble à un problème où une solution différente serait mieux.

+0

Hi..actuellement je vais essayer de générer un code de hachage unique pour l'objet string comme url string nd Supposons que ma base de données est très énorme.Nous savons que deux objets différents peuvent avoir le même code de hachage .. Je veux savoir si nous pouvons créer un code de hachage unique pour un objet qui évitera la collision et retournera le code de hachage cohérent sur l'exécution de l'application pour plusieurs fois.Il existe un mécanisme pour ce faire. – saggy

0

En regardant dans le contract of hashCode:

  • Chaque fois qu'il est invoqué sur le même objet plus d'une fois lors d'une exécution d'une application Java, la méthode hashCode doit toujours retourner le même entier, à condition non informations utilisées dans des comparaisons égales sur l'objet est modifié. Cet entier ne doit pas rester cohérent à partir d'une exécution d'une application à une autre exécution de la même application .
  • Si deux objets sont égaux selon la méthode equals (Object), puis appeler la méthode hashCode sur chacun des les deux objets doivent produire le même résultat entier.
  • Il est pas nécessaire que si deux objets sont inégaux selon le procédé equals (java.lang.Object), puis appelant la méthode hashCode sur chacune des les deux objets doivent produire des résultats entiers distincts. Cependant, le programmeur doit être conscient que produisant des résultats entiers distincts pour des objets inégaux peut améliorer les performances des tables de hachage .

Il est donc pas garanti que le hashCode est euqal entre les invocations. En réalité, il existe de nombreuses implémentations de hashCode qui renvoient la même valeur à travers les invocations: String et tous les types utilisés pour la boxe (comme Integer) ont une valeur de retour cohérente pour hashCode. Les objets qui ne combinent que des hashCodes membres dans lesquels chaque membre a une valeur de retour cohérente présentent également cette cohérence. Ainsi, en pratique, il devrait être plutôt courant d'avoir une valeur de retour hashCode cohérente entre les invocations.

+0

supposons que j'ai une chaîne par exemple gmail.com.je veux savoir s'il est possible de générer un code de hachage unique pour cela, ce qui m'aidera à améliorer la performance et une autre chose est, il devrait me renvoyer le même code de hachage à chaque fois y accéder.Est-il un moyen de le faire. – saggy

+0

Regardez le code de java.lang.String: Son hashCode dépend de tous ses caractères et rien d'autre, ce qui signifie que deux chaînes composées des mêmes caractères ont toujours le même hashCode. Donc "gmail.com" .hashCode() renvoie déjà une valeur pour toutes les invocations séparées. –

+0

des millions d'objets string sont là..ainsi que nous savons que deux objets différents peuvent également avoir le même code de hachage.que pouvons-nous faire pour éviter une telle collision.il existe une solution pour cela? – saggy