Ссылка на объект, используя его хэш-код? - PullRequest
0 голосов
/ 24 мая 2011

Я создал объект, скажем, детали. Затем я назначаю: int x = details.GetHashCode ();

Позже в программе я хотел бы получить доступ к этому объекту, используя целое число x. Есть ли способ сделать это в C #?

Большое спасибо

Пол

Ответы [ 7 ]

7 голосов
/ 24 мая 2011

Нет:

  • Возможно, это был сбор мусора, если у вас нет чего-то, что могло бы это остановить.
  • Хэш-коды не уникальны - что, если естьдва объекта с одинаковым хеш-кодом?(См. Сообщение Эрика Липперта о хэш-кодах для получения дополнительной информации.)

Вы могли бы создать (скажем) Dictionary<int, Details> и использовать хэш-код в качествеключ - но я настоятельно рекомендую, чтобы вы не сделали это.

По какой причине вы не хотите просто хранить ссылку на объект вместо хеш-кода?

0 голосов
/ 24 мая 2011

Хеш-код не предназначен для непосредственного использования.Его основное назначение - чтобы элемент можно было использовать в качестве ключа в коллекции.В этом случае коллекции несут ответственность за сопоставление хеша с объектом.в основном это позволяет вам делать что-то вроде Dictonary<details, myClass2>, что было бы намного сложнее, если бы GetHashCode не был реализован ... но функция не очень полезна, если вы не реализуете свою собственную коллекцию или оператор равенства.

0 голосов
/ 24 мая 2011
public static Detail GetDetailsFromHash(this List<Detail> detailsList, int x) {
    foreach (var details in detailslist) {
        if (details.GetHashCode() == x) {
            return details;
        }
    }
    return null;
}

Однако хеш-коды не гарантированно являются уникальными

0 голосов
/ 24 мая 2011

Сохраните целое число и просто проверьте хэш-код еще раз.

Обратите внимание, что в C # хэш-код не гарантированно уникален. Если вы имеете дело с несколькими миллионами объектов, вы можете легко встретить дубликаты хеша с реализацией по умолчанию.

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

"Реализация по умолчанию метода GetHashCode не гарантирует уникальные возвращаемые значения для различных объектов."

0 голосов
/ 24 мая 2011

Да, вы можете создать Dictionary<int,Details> и сохранить объект в этом словаре, используя хеш-код из details.GetHashCode( ), а затем вытащить объект из словаря, используя x.

Но это не то, что я бы предложил сделать! Что ты пытаешься достичь?

0 голосов
/ 24 мая 2011

Если есть способ, который идет против ориентации объекта.Вы должны предоставить подробные ссылки на код потребления.

0 голосов
/ 24 мая 2011

Нет.

Хэш-код представляет значение некоторой хеширующей функции для объекта.

Вы не можете воссоздать исходную ссылку на объект из этого, и, что более важно, нет гарантии, что объектвсе еще существует.

...