У меня есть огромный (> 10 м) список записей. Каждая запись предлагает две хеш-функции:
- Дешевый: быстро вычисляет хэш, но его распределение ужасно (может поместить 99% элементов в 1% хеш-пространства).
- Дорогой: требует много времени для вычислений, но дистрибутив также намного лучше.
Обычный словарь позволяет мне использовать только одну из этих хеш-функций. Мне нужен словарь, который сначала использует дешевую хеш-функцию и проверяет дорогую на коллизии.
Кажется хорошей идеей использовать для этого словарь внутри словаря. В настоящее время я в основном использую это чудовище:
Dictionary<int, Dictionary<int, List<Foo>>>;
Я улучшил этот дизайн, чтобы дорогой хэш вызывался только в том случае, если на самом деле есть два элемента одного и того же дешевого хэша.
Он идеально подходит и безупречно справляется со своей задачей, но выглядит так, как будто он должен был умереть 65 миллионов лет назад.
Насколько мне известно, эта функциональность не включена в базовую структуру. Я собираюсь написать класс DoubleHashedDictionary, но сначала хотел узнать ваше мнение.
Что касается моего конкретного случая:
Первая хэш-функция = количество файлов в каталоге файловой системы (быстро) Вторая хеш-функция = сумма размеров файлов (медленно)
Правки:
- Изменено название и добавлено больше информации.
- Добавлена довольно важная недостающая деталь