OVH Cloud OVH Cloud

Gros problème de HashCode

2 réponses
Avatar
Beaugrand
Bonjour,

Il me semble que j'ai un gros problème de hashcode avec la plateforme .NET
1.1 fr.

Mon appli fonctionne tres bien :

- en debug dans VS.NET
- en Release dans VS.NET

En version Release installée par le Setup ça fonctionne bien sur un poste
mais ça plante sur un autre poste avec un cas qui me semble impossible.
C'est comme si la framework était "partie en vrac" sur ce poste et que la
fonction GetHashCode ne fonctionnait plus correctement ???

Le problème identifié :

Mon appli manipule un tres grand nombre d'objets (plusieurs centaines de
millions) qui sont identifiés grace à leur HashCode et stockés dans des
HashTables.
Le plantage provient du fait qu'à un moment 2 objets différents instanciés
d'une même classe possèdent le même HashCode => plantage à l'insertion dans
la Hashtable car en principe cela est impossible et bien sur nous ne testons
pas ce cas pour optimiser les performances.

Les objets sont bien différents :

objA.Equals(objB) => False

et pourtant :

objA.GetHashCode est égal à objB.GetHashCode

Merci de m'aider à éclairer sur ce problème qui me semble très inquiétant
pour le projet (2 ans de développement déjà à 3 personnes).

Sebastien Beaugrand

2 réponses

Avatar
Xavier Pillons [MS]
Bonjour Sebastien,

Je pense qu'en faite il y a un problème de design dans votre application. La
fonction GetHashCode() ne garantie pas l'unicité comme spécifié dans la
documentation
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemobjectclassgethashcodetopic.asp

L'implémentation par défaut de GetHashCode ne garantit ni son unicité ni sa
cohérence ; par conséquent, vous ne devez pas l'utiliser en tant
qu'identificateur d'objet unique à des fins de hachage. Les classes dérivées
doivent substituer la méthode GetHashCode à l'aide d'une implémentation qui
retourne un code de hachage unique. Pour obtenir de meilleurs résultats,
basez le code de hachage sur la valeur d'un champ ou d'une propriété
d'instance, et non sur un champ ou une propriété statique.

De ce fait son utilisation sur une grande distribution peut arriver à la
création de doublons.

Il me semble donc que vous devriez ajouter à vos objet un Guid et l'utiliser
comme clef unique dans vos tables de hashage

Cordialement,
--
Xavier Pillons
Microsoft Services



"Beaugrand" wrote in message
news:ub5jBo6$
Bonjour,

Il me semble que j'ai un gros problème de hashcode avec la plateforme .NET
1.1 fr.

Mon appli fonctionne tres bien :

- en debug dans VS.NET
- en Release dans VS.NET

En version Release installée par le Setup ça fonctionne bien sur un poste
mais ça plante sur un autre poste avec un cas qui me semble impossible.
C'est comme si la framework était "partie en vrac" sur ce poste et que la
fonction GetHashCode ne fonctionnait plus correctement ???

Le problème identifié :

Mon appli manipule un tres grand nombre d'objets (plusieurs centaines de
millions) qui sont identifiés grace à leur HashCode et stockés dans des
HashTables.
Le plantage provient du fait qu'à un moment 2 objets différents instanciés
d'une même classe possèdent le même HashCode => plantage à l'insertion
dans la Hashtable car en principe cela est impossible et bien sur nous ne
testons pas ce cas pour optimiser les performances.

Les objets sont bien différents :

objA.Equals(objB) => False

et pourtant :

objA.GetHashCode est égal à objB.GetHashCode

Merci de m'aider à éclairer sur ce problème qui me semble très inquiétant
pour le projet (2 ans de développement déjà à 3 personnes).

Sebastien Beaugrand








Avatar
Beaugrand
Bonjour,

Merci pour ces précisions. Cela est effectivement très clair dans la doc.
Nous allons remplacer cette fonction par un Guid pour corriger ce problème
dans notre application.

Cordialement,
Sébastienb Beaugrand


"Xavier Pillons [MS]" a écrit dans le
message de news: uz%23Kr99$
Bonjour Sebastien,

Je pense qu'en faite il y a un problème de design dans votre application.
La fonction GetHashCode() ne garantie pas l'unicité comme spécifié dans la
documentation
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemobjectclassgethashcodetopic.asp

L'implémentation par défaut de GetHashCode ne garantit ni son unicité ni
sa cohérence ; par conséquent, vous ne devez pas l'utiliser en tant
qu'identificateur d'objet unique à des fins de hachage. Les classes
dérivées doivent substituer la méthode GetHashCode à l'aide d'une
implémentation qui retourne un code de hachage unique. Pour obtenir de
meilleurs résultats, basez le code de hachage sur la valeur d'un champ ou
d'une propriété d'instance, et non sur un champ ou une propriété statique.

De ce fait son utilisation sur une grande distribution peut arriver à la
création de doublons.

Il me semble donc que vous devriez ajouter à vos objet un Guid et
l'utiliser comme clef unique dans vos tables de hashage

Cordialement,
--
Xavier Pillons
Microsoft Services



"Beaugrand" wrote in message
news:ub5jBo6$
Bonjour,

Il me semble que j'ai un gros problème de hashcode avec la plateforme
.NET 1.1 fr.

Mon appli fonctionne tres bien :

- en debug dans VS.NET
- en Release dans VS.NET

En version Release installée par le Setup ça fonctionne bien sur un poste
mais ça plante sur un autre poste avec un cas qui me semble impossible.
C'est comme si la framework était "partie en vrac" sur ce poste et que la
fonction GetHashCode ne fonctionnait plus correctement ???

Le problème identifié :

Mon appli manipule un tres grand nombre d'objets (plusieurs centaines de
millions) qui sont identifiés grace à leur HashCode et stockés dans des
HashTables.
Le plantage provient du fait qu'à un moment 2 objets différents
instanciés d'une même classe possèdent le même HashCode => plantage à
l'insertion dans la Hashtable car en principe cela est impossible et bien
sur nous ne testons pas ce cas pour optimiser les performances.

Les objets sont bien différents :

objA.Equals(objB) => False

et pourtant :

objA.GetHashCode est égal à objB.GetHashCode

Merci de m'aider à éclairer sur ce problème qui me semble très inquiétant
pour le projet (2 ans de développement déjà à 3 personnes).

Sebastien Beaugrand