Я ничего не знаю о .NET, но попытаюсь говорить за Java.
В Java хеш-код в конечном итоге представляет собой комбинацию кода, возвращаемого функцией hashCode () данного объекта, и вторичной хеш-функцией внутри класса HashMap / ConcurrentHashMap (интересно, что оба используют разные функции). Обратите внимание, что Hashtable и Dictionary (предшественники HashMap и AbstractMap) являются устаревшими классами. И список на самом деле просто «что-то еще».
Например, класс String создает хеш-код, многократно умножая текущий код на 31 и добавляя следующий символ. См. Мою статью о , как работает хеш-функция String , для получения дополнительной информации. Числа обычно используют "себя" в качестве хэш-кода; другие классы, например Прямоугольник, имеющий комбинацию полей, часто использует комбинацию метода String - умножение на небольшое простое число и добавление, но добавление различных значений поля. (Выбор простого числа означает, что вы вряд ли получите «случайные взаимодействия» между определенными значениями и шириной хеш-кода, поскольку они не делятся ни на что.)
Так как размер хеш-таблицы - то есть количество «сегментов», которыми она обладает - является степенью двойки, номер сегмента получается из хеш-кода, по существу, путем отсечки верхних битов до тех пор, пока хеш-код не окажется в диапазоне , Вторичная хеш-функция защищает от хеш-функций, в которых вся или большая часть случайности находится в этих старших битах, «распределяя биты вокруг» так, чтобы некоторая часть случайности заканчивалась в младших битах и не блокировалась. Хеш-код String на самом деле работал бы довольно хорошо без этого микширования, но созданные хеш-коды могут работать не очень хорошо. Обратите внимание, что если два разных хеш-кода разрешают к одному и тому же номеру сегмента, реализации Java в HashMap используют технику «сцепления» - то есть они создают связанный список записей в каждом блоке. Таким образом, важно, чтобы хэш-коды имели хорошую степень случайности, чтобы элементы не группировались в определенный диапазон сегментов. (Однако даже при совершенной хэш-функции вы по закону средних значений будете ожидать некоторого сцепления.)
Реализация хеш-кода не должна быть загадкой. Вы можете посмотреть на источник hashCode () для любого класса, который вы выберете.