C#, как вычислить хэш-код от ссылки на объект

Люди, вот тернистая проблема для Вас!

Часть системы TickZoom должна собрать экземпляры каждого типа объекта в Словарь <> тип.

Обязательно, что их равенство и хэш-код быть основанными на экземпляре объекта, что означает ссылочное равенство вместо равенства значения. Проблема состоит в том, что некоторые объекты в системе переопределили, Равняется () и GetHashCode () для использования в качестве равенства значения, и их внутренние значения будут изменяться со временем. Это означает, что их Равняется, и GetHashCode бесполезны. Как решить это в общем, а не навязчиво?

До сих пор Мы создали структуру для обертывания каждого объекта под названием ObjectHandle для хеширования в Словарь. Как Вы видите ниже, мы реализовали, Равняется (), но проблема того, как вычислить хэш-код, остается.

public struct ObjectHandle : IEquatable<ObjectHandle>{
    public object Object;
    public bool Equals(ObjectHandle other) {
        return object.ReferenceEquals(this.Object,other.Object);
    }
}

Видеть? Существует объект метода. ReferenceEquals (), который сравнит ссылочное равенство не принимая во внимание любого переопределенного, Равняется () реализации в объекте.

Теперь, как вычислить соответствие GetHashCode (), только считая ссылку без беспокойства о каком-либо переопределенном GetHashCode () методом?

Ahh, я надеюсь, что это дает Вам интересную загадку. Мы застреваем здесь.

С уважением, Wayne

15
задан Wayne 31 May 2010 в 16:28
поделиться

3 ответа

RuntimeHelpers.GetHashCode () делает именно то, что здесь необходимо.

20
ответ дан 1 December 2019 в 03:24
поделиться

Вы нарушаете шаблон, это приводит к вопросам, которые невозможно решить. Метод Equals должен сравнивать содержимое объектов вместо сравнения ссылок. Это то, что делает object.Equals , зачем переопределять с таким же поведением?

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

2
ответ дан 1 December 2019 в 03:24
поделиться

Хэш-код не обязательно должен быть уникальным. (Но уникальность улучшит производительность).
Итак - одна вещь, которую вы можете сделать, - это установить хэш-код по имени типа. Все объекты одного типа будут иметь одинаковый хэш-код.

0
ответ дан 1 December 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: