Есть ли встроенный IEqualityComparer, который сравнивает объекты только по их хеш-значениям?

Есть ли встроенный IEqualityComparer, который сравнивает объекты по значению, возвращаемому их значением GetHashCode? Это легко написать, но я бы предпочел использовать предоставленный класс вместо пользовательского.

Текущий код:

private class HashComparer : IEqualityComparer<TKey>
{
    private readonly Func<TKey, int> _Hasher;

    public HashComparer (Func<TKey, int> hasher)
    {
        _Hasher = hasher;
    }

    public bool Equals (TKey x, TKey y)
    {
        // null supposed to throw, therefore no check
        return _Hasher (x) == _Hasher (y);
    }

    public int GetHashCode (TKey obj)
    {
        return _Hasher (obj);
    }
}

person mafu    schedule 24.11.2009    source источник
comment
Вероятно, не существует.   -  person malay    schedule 24.11.2009
comment
Почему? Потому что в моем конкретном случае это именно то, что мне нужно :)   -  person mafu    schedule 24.11.2009


Ответы (1)


Нет, такой вещи не существует в рамках, насколько мне известно.

В общем, это было бы Плохо - хэш-коды не должны быть уникальными, поэтому их нельзя было бы использовать для имитации нормального равенства, за исключением типов с 2 ^ 32 возможными значениями или меньше, и алгоритма генерации хэша, который дает уникальный код для каждого значения.

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

Ради интереса, что вы пытаетесь с этим сделать?

person Jon Skeet    schedule 24.11.2009
comment
Создание Dictionary<TKey, Dictionary<TKey, TValue>>, где внешний словарь использует хэш для доступа к подходящему внутреннему словарю. Внутренний словарь использует обычное сравнение на равенство. - person mafu; 24.11.2009
comment
Я не вижу применения дорогого хэша. Почему бы просто не использовать всегда дешевый хэш, а затем равенство для коллизий? Но если вы действительно хотите пойти по этому пути, вам просто нужно реализовать свой собственный компаратор IEqualityComparer. Как вы говорите, это будет легко (даже тривиально) сделать. - person Jon Skeet; 24.11.2009
comment
Дешевый хэш имеет ужасное распространение, а дорогой хэш... ну... дорогой. - person mafu; 24.11.2009
comment
Насколько ужасна эта дешевая раздача хэша? И насколько дорог дорогой хэш по сравнению с проверкой на равенство? В любом случае, вы знаете, как это сделать, если вам очень-очень нужно... но не удивляйтесь, что этого нет во фреймворке :) - person Jon Skeet; 24.11.2009
comment
Это так же ужасно, как хэширование папок по количеству содержащихся в них файлов. Очень ужасно :) --- Я не особо удивлен. Как вы сказали, такого класса в норме быть не должно. - person mafu; 24.11.2009