Хеш сборки и типа .NET - PullRequest
       12

Хеш сборки и типа .NET

1 голос
/ 02 августа 2010

В моем приложении мне нужно вычислить хеш заданной сборки .NET и заданного типа.Сборки и типы для хеширования загружаются динамически в этом сценарии.

Встроенный метод объекта GetHashCode возвращает разные значения при каждом запуске приложения.

Как вычислить детерминированную хеш-функцию сборкиили тип?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 02 августа 2010

Это зависит от того, какое равенство вы действительно ищете:

  • Если у вас была другая копия сборки в другом месте, это должно изменить хэш?
  • Если тот же код был перестроен, должно ли это изменить хэш?
  • Если код изменился и , то был перестроен, должно ли это изменить хэш?

Вы можете обнаружить, что достаточно просто хэшировать полное имя сборки (или тип) ... но нам нужно знать больше о ваших требованиях, чтобы сказать наверняка.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш комментарий (первоначально в комментарии, но потом он становился слишком длинным):

Хорошо, это несколько сложно ... файл сборки содержит некоторые вещи, которые меняются в каждой сборке (возможно, дата сборки, возможно, произвольный GUID; прошло некоторое время с тех пор, как я исследовал). Вы захотите выбросить эти данные.

Если вас интересуют только подписи для сборки, вы можете перебрать все открытые типы (в лексикографическом порядке), затем получить хэш этих типов и объединить их. Для каждого хеша вы должны получить всех открытых членов (возможно, защищенных тоже?) И хешировать подписи - например, путем объединения хеша полных имен возвращаемого типа, имени члена и параметров. Для каждого параметра вы хотите указать тип, возможно имя и статус ссылки / выхода. Как видите, все становится довольно сложно:)

Чтобы объединить несколько хешей (поскольку это, безусловно, будет включать где-то :) Я склонен использовать что-то вроде этого:

int hash = 17;
hash = hash * 31 + FirstHash();
hash = hash * 31 + SecondHash();
hash = hash * 31 + ThirdHash();
// etc
return hash;
0 голосов
/ 03 августа 2010

Подумайте над тем, чтобы вызвать GetHashCode() для имени сборки или для имени, соответствующего типу сборки. Это должно быть более согласованным между выполнениями вашего приложения.

...