Peut de Java hashCode produire la même valeur pour les différentes chaînes?
Est-il possible d'avoir le même hashcode pour différentes chaînes de caractères à l'aide de java hashcode de la fonction?ou si c'est possible, alors quel est le % de ses possibilités?
Vous devez vous connecter pour publier un commentaire.
Java code de hachage est 32bits. Le nombre de chaînes qu'il hachages est infini.
Donc oui, il y aura des collisions. Le pourcentage est dénuée de sens, il y a un nombre infini d'éléments (chaînes de caractères) et d'un nombre fini de possible de hachages.
char
tableau et les tableaux en Java (à l'aide de la norme de la JVM) ont une taille maximale. Par conséquent, le nombre de chaînes n'est pas infinie.OUI. Beaucoup.
Regarder la suite de la paire de
peut revenir même code de hachage, même si les caractères ne sont pas les mêmes.
Fondamentalement, c'est la somme des caractères dans une chaîne, multiplié par un nombre entier.
Oui, il est tout à fait possible. La probabilité d'une chaîne (ou un autre type d'objet -- juste en supposant que vous allez être en utilisant des chaînes dans cet exemple) ayant le même hashcode comme une autre chaîne dans une collection, dépend de la taille de la collection (en supposant que toutes les chaînes dans cette collection sont uniques). Les probabilités sont réparties comme suit:
Les hypothèses formulées sont les suivantes:
Ce site l'explique clairement: http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
(Regardez "la deuxième chose que vous devez savoir")
Qui n'est pas particulièrement significative question.
Toutefois, sauf s'il existe un biais systémique dans le
String::hashcode
de la fonction ou de la façon dont vous êtes la génération de laString
objets, la probabilité que deux différents (non égal)String
objets ont le même code de hachage sera de 1 à 232.Cela suppose que les Cordes sont choisis au hasard à partir de l'ensemble de toutes les valeurs de Chaîne. Si vous restreindre le jeu de différentes manières, la probabilité varie de numéro ci-dessus. (Par exemple, l'existence de la "FB" /"Ea" collision signifie que la probabilité de collision dans le jeu de tous les 2 chaînes de lettres est plus élevée que la norme.)
Une autre chose à noter est que la chance de la 232 différentes chaînes de caractères choisis au hasard (à partir d'un beaucoup plus impartiale ensemble de chaînes n'ayant pas de collisions de hachage est extrêmement petit. Pour comprendre pourquoi, lire la page de Wikipedia sur le Le Paradoxe D'Anniversaire.
En réalité, la seule façon que vous allez obtenir pas de collisions de hachage dans un ensemble de 232 différentes chaînes est si vous sélectionnez ou de générer des chaînes de caractères. Même formant l'ensemble en sélectionnant généré de façon aléatoire des chaînes va être gourmand en ressources. Pour produire un tel ensemble de manière efficace, vous avez besoin pour exploiter les propriétés de la
String::hashCode
algorithme, qui (heureusement) est spécifié.Ce ne serait pas répondre directement à votre question, mais j'espère que cela aide.
Ci-dessous l'est à partir du code source de
java.lang.String
.Oui, il est possible pour les deux Chaînes ont le même hashcode - Si vous prenez un coup d'oeil à la Article de Wikipedia, vous verrez que les deux
"FB"
et"Ea"
ont le même hashcode. Il n'y a rien dans la méthode du contrat de dire unhashCode()
devraient être utilisées pour comparer l'égalité, vous souhaitez utiliserequals()
pour que.Depuis Java 1.2, la Chaîne met en œuvre
hashCode()
par à l'aide d'un produit algorithme de somme sur l'ensemble du texte de la chaîne.Oui, par définition, un casier de ce concept, deux chaînes peuvent produire le même hashcode et le code doit toujours être écrit pour répondre à de telles conditions (généralement, ne pas les casser.)
Le pourcentage de collisions pour aléatoire chaînes devraient être minimes. Toutefois, si vous hachage des chaînes à partir de sources externes, un attaquant pourrait facilement créer des centaines de milliers de chaînes ayant le même hashcode. Dans une java HashMap tous ces carte pour le même seau et effectivement faire tourner la carte dans une liste chaînée. Les temps d'accès à la carte serait alors proportionnelle à la taille de la carte au lieu de la constante, entraînant un déni de service (ddos).
Voir cette page sur Efficace DoS d'attaques contre les Applications Web Plattforms pour plus d'informations, des liens vers la présentation.
Oui, c'est possible, parce qu'un contrat entre égaux() & hashCode() la méthode de la classe Object est..........
Si deux objets ne sont pas égaux selon la méthode equals() alors il n'y a aucune garantie que leurs hashCode sera le même, le hashCode peut/ne peut pas être égal.
j'.e, si obj1.equals(obj2) return false alors obj1.hashCode()==obj2.hashCode() peut/ne peut pas retourner la valeur true.
Exemple:
//Vous pouvez exécuter le code ci-dessous avec -Xmx2100m et peut obtenir plusieurs résultats, assez pour remplir votre console
`
`
Oui(et pas seulement en Java, il s'applique à n'importe quelle langue), il peut produire le même hash-code pour les différentes chaînes.
Je rappelle une règle enseignée par mon professeur, il pourrait être utile ici -
exemple en python
Il y a peut être une autre chaîne de caractères qui peut correspondre à la même hash-code, donc on ne peut pas dériver la clé à l'aide de hash-code.