Проверьте, является ли объект тем же - PullRequest
0 голосов
/ 08 октября 2010

Я делаю несколько запросов к активному каталогу, создаю свой собственный словарь, содержащий имя, телефон и электронную почту для пользователя.

тогда я сохраняю пользователя в файл, что-то вроде этого: домен \ groupt \ группа \ пользователь; <checksum>

где путь раньше; это уникальный идентификатор пользователя (пользователь может быть в разных группах, поэтому я должен отслеживать это), а <checksum> - это .GetHashCode () этого объекта Dictinary для этого пользователя.

Затем у меня есть таймер, который каждые 30 секунд проверяет AD и создает для пользователя ту же самую статистику и ищет идентификатор и контрольную сумму из файла.

НО это не работает. По какой-то причине .GetHashCode () генерирует новый тип int, когда имя, телефон или адрес электронной почты не меняются ... поэтому я думаю, что это не используемая функция.

Так как я могу проверить, изменился ли объект так, как я пытался описать выше?

Ответы [ 4 ]

1 голос
/ 08 октября 2010

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

Что-то вроде

public override int GetHashCode()
{
  return string.Concat(this.Domain,this.Name,...).GetHashCode();
}

Но, в любом случае, сравнение HashCodes только гарантирует, что объекты не равны, когда результат отличается, если хеш-коды одинаковы, вам все равно нужно проверить, является ли содержимое одинаковым или нет. HashCode полезен для распределения объектов в Hastables, но не для реального сравнения.

Вам лучше реализовать IComparable интерфейс в ваших классах.

0 голосов
/ 08 октября 2010

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

0 голосов
/ 08 октября 2010

Я подозреваю, что причина, по которой ваши хеш-коды меняются, состоит в том, что вы не переопределили GetHashCode () в своем классе, который объединяет ваши три поля, поэтому он использует реализацию по умолчанию, которая возвращает хеш-код, специфичный для конкретного объекта (а не его значений)).Однако я бы порекомендовал вообще не использовать GetHashCode для вашей проблемы, поскольку эти значения необходимы для сохранения на диске и будут полезны между вызовами вашего приложения.

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

Если вы хотите что-то, на что вы можете положиться при сохранении на диск и перезагрузке, вам следует переключиться на хеш-функцию с поведением, которое хорошо определено (или, альтернативно, что вы можете контролировать).Список таких алгоритмов можно найти на странице списка хеш-функций *1011* на странице Википедии.В частности, некриптографические подходят для этой задачи.(Хотя нет никакой причины, кроме производительности, почему вы не можете использовать криптографическую.)

0 голосов
/ 08 октября 2010

Попробуйте переопределить GetHashCode(), чтобы вернуть что-то уникальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...