Salut à tous, J'ai lu la meilleure façon d'implémenter le remplacement de GetHashCode() pour les objets dans .NET, et la plupart des réponses que je rencontre impliquent des numéros de monging des membres qui sont types numériques à venir avec une méthode. Le problème est, j'ai un objet qui utilise une chaîne alphanumérique comme clé, et je me demande s'il y a quelque chose de fondamentalement faux en utilisant simplement un ID interne pour les objets avec des chaînes comme des clés, quelque chose comme ceci?GetHashCode() avec les clés de chaîne
// Override GetHashCode() to return a permanent, unique identifier for
// this object.
static private int m_next_hash_id = 1;
private int m_hash_code = 0;
public override int GetHashCode() {
if (this.m_hash_code == 0)
this.m_hash_code = <type>.m_next_hash_id++;
return this.m_hash_code;
}
Y at-il une meilleure façon de trouver un code de hachage unique pour un objet qui utilise une chaîne alphanumérique comme clé? (Et non, les parties numériques de la chaîne alphanumérique ne sont pas uniques, certaines de ces chaînes ne contiennent pas de nombres du tout.) Toutes les pensées seraient appréciées!
Mais que se passe-t-il si cette chaîne change? Par exemple, je pourrais créer un nouvel objet Utilisateur avec: User foo = new User(); et le constructeur définit User.Id = "". Plus tard, si je dis User.Id = "A12345"; et je retourne this.Id.GetHashCode() comme le résultat de foo.GetHashCode(), n'aura-t-il pas changé, violant le principe que le code de hachage d'un objet ne devrait jamais changer? –
L'objet a été modifié. Le code de hachage * doit également changer *. –
@King - il existe plusieurs façons d'utiliser les codes de hachage. La valeur du code de hachage doit toujours être la même pour la même valeur de départ. Si votre valeur est mutable, vous devez stocker le hashcode résultant et le renvoyer à la place lorsque 'GetHashCode()' est appelé. –