2010-08-02 5 views
1

Dans mon application, j'ai besoin de calculer un hachage d'un assembly .NET donné et d'un type donné. Les assemblys et les types à hacher sont chargés dynamiquement dans ce scénario.Hash of .NET assembly et type

Méthode intégrée de l'objet GetHashCode renvoie une valeur différente chaque fois qu'une application est démarrée.

Comment calculer une fonction de hachage déterministe d'un assemblage ou d'un type?

Toute aide serait grandement apprécié.

Répondre

2

Cela dépend de quel genre d'égalité que vous cherchez, vraiment:

  • Si vous aviez une autre copie de l'assemblée à un autre endroit, devrait-il changer le hachage?
  • Si le même code a été reconstruit, cela devrait-il changer le hachage?
  • Si le code a changé et alors a été reconstruit, cela devrait-il changer le hachage?

Vous peut trouver que tout hachant le nom complet de l'ensemble (ou type) est assez ... mais nous avions besoin de savoir plus sur vos besoins pour dire à coup sûr.

EDIT: Pour répondre à votre commentaire (à l'origine dans un commentaire, mais il se faisait trop longtemps):

D'accord, c'est un peu délicat ... un fichier d'assemblage contient certaines choses qui changent à chaque construction (peut-être une date de construction, éventuellement un GUID aléatoire, c'est un peu de temps depuis que j'ai enquêté). Vous voudrez jeter ces données.

Si vous n'êtes intéressé que par signatures pour l'ensemble vous pouvez aussi parcourir tous les types publics (dans l'ordre lexicographique), puis obtenir le hash de ces types et les combiner. Pour chaque hachage, vous obtiendrez tous les membres du public (éventuellement protégés aussi?) Et hacher les signatures - par ex. en combinant le hachage des noms complets du type de retour, du nom de membre et des paramètres. Pour chaque paramètre, vous voudriez inclure le type, éventuellement le nom, et le statut de ref/out. Comme vous pouvez le voir, il devient assez compliqué :)

Pour combiner plusieurs hash (comme cela va clairement impliquer quelque part :) J'ai tendance à utiliser quelque chose comme ceci:

int hash = 17; 
hash = hash * 31 + FirstHash(); 
hash = hash * 31 + SecondHash(); 
hash = hash * 31 + ThirdHash(); 
// etc 
return hash; 
+0

1. La copie exacte de l'assemblage à un emplacement différent doit avoir le même hachage que l'assemblage d'origine. 2. Si le même code a été reconstruit, je veux que le hachage reste inchangé. 3. Oui, le code a été changé puis reconstruit Je veux que le hachage soit différent, au moins dans le cas d'un assemblage. Avec le hash du type, je peux accepter que changer le corps de la méthode (et laisser toutes les signatures inchangées) ne changera pas le hachage. – mgamer

+0

@michael: J'ai modifié ma réponse pour refléter votre commentaire. –

0

GetHashCode() sur l'appel Tenir compte de la nom de l'assembly ou sur le nom qualifié de l'assembly du type. Cela devrait être plus cohérent entre les exécutions de votre application.

Questions connexes