2010-10-08 3 views
0

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

Затем я хранил пользователя в файле, примерно так: domain \ groupt \ group \ user; <checksum>

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

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

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

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

+1

Невозможно проверить дату модификации? –

+0

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

+0

Опубликуйте код для переопределения GetHashCode(). Скорее всего, там, где недостаток. –

ответ

1

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

Что-то вроде

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

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

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

+0

Что делать, если мой объект, который я хочу получить от GetHashCode, является Словарем currUser = new Dictionary () ;? Эти же данные вставляются, но хеш изменяется в currUser.GetHashCode() – Jason94

+0

Вот почему вам нужно создать объект User, чтобы вы могли переопределить метод GetHashCode. Вы можете наследовать словарь и создать новый класс UserDictionary: Dictionary , где вы переопределяете метод GetHashCode. Метод GetHashCode, как я уже отмечал ранее, предназначен только для обеспечения хорошего распределения объектов в HashTable, а не для проверки на равные, для этого вам нужно реализовать IComparable. – jmservera

0

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

0

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

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

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

0

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

Смежные вопросы