À l'aide de hashcode pour un ID unique

Je travaille dans une java-based système où j'ai besoin de mettre un id pour certains éléments dans l'affichage visuel. Une catégorie d'éléments de Chaînes, j'ai donc décidé d'utiliser la Chaîne de caractères.hashCode() méthode pour obtenir un identifiant unique pour ces éléments.

Le problème que j'ai rencontré, cependant, est que le système que je suis en train de travailler dans borks si l'id est négatif et String.hashCode souvent renvoie des valeurs négatives. Une solution rapide est d'utiliser les Mathématiques.abs() autour de la hashcode appel à la garantie d'un résultat positif. Ce que je me demandais à propos de cette approche est de savoir quelles sont les chances que deux éléments distincts ayant le même hashcode?

Par exemple, si une chaîne de caractères retourne un hashcode de -10 et une autre chaîne de caractères retourne un hashcode de 10 une erreur se produit. Dans mon système, nous parlons des collections d'objets qui ne sont pas plus de 30 éléments de grandes généralement, donc je ne pense pas que ce serait vraiment un problème, mais je suis curieux de savoir ce que les mathématiques dit.

Si vous pouvez être sûr d'une petite limite supérieure du nombre d'objets que vous avez, vous pouvez vérifier pour une collision chaque fois que vous calculez un id. Si vous en trouvez un, vous pouvez ajouter 1 jusqu'à ce que vous avez obtenu une valeur unique, par exemple, en faisant attention de dépassement d'entier. Ou tout simplement faire les id 1,2,3, ...
Il n'y a pas de Math.abs(Integer.MIN_VALUE) comme -MIN_VALUE == MIN_VALUE == 0x8000_0000. Utilisation hc & Integer.MAX_VALUE au lieu de cela, si vous restez avec votre stratégie.

OriginalL'auteur IcedDante | 2014-01-26