Прежде всего, документацию для string.GetHashCode специально говорит не использовать строковые хеш-коды для любого приложения, где они должны быть стабильными с течением времени, потому что они не являются. Вы должны использовать строковые хеш-коды только для одной цели, а именно для ввода строк в словаре.
Во-вторых, хэш-коды не являются уникальными. Есть только четыре миллиарда возможных хэш-кодов (потому что хеш-код представляет собой 32-битное целое число), но, очевидно, существует более четырех миллиардов строк, поэтому должно быть много строк, имеющих один и тот же хеш-код. Коллекция из нескольких тысяч строк имеет чрезвычайно высокую вероятность содержать две строки с одним и тем же хэш-кодом. График вероятности здесь:
http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx
Таким образом, вы можете удивиться, как словарь работает на всех, то, если он использует GetHashCode, но могут быть столкновения. Ответ: когда вы помещаете две вещи X и Y в словарь, имеющие один и тот же хеш-код, они входят в одно и то же «ведро». Когда вы ищете X, словарь переходит в правое ведро с использованием хеш-кода, а затем выполняет дорогостоящую проверку равенства для каждого элемента в ведре до тех пор, пока не найдет правильный. Поскольку каждый ковш невелик, эта проверка выполняется достаточно быстро.
Я не знаю, как решить вашу проблему, но использование 32-битного хеша явно не подходит для этого, поэтому попробуйте что-нибудь еще. Мое предложение состояло бы в том, чтобы начать использовать базу данных, а не файлы CSV, если у вас есть много данных для управления. Для этого нужна база данных.
Я написал много статей по струнной хеширования, которые могли бы вас заинтересовать:
http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/
http://blogs.msdn.com/b/ericlippert/archive/2011/07/12/what-curious-property-does-this-string-have.aspx
http://blogs.msdn.com/b/ericlippert/archive/2005/10/24/do-not-use-string-hashes-for-security-purposes.aspx
http://blogs.msdn.com/b/ericlippert/archive/tags/hashing/
Я думаю, вы найдете эту нить интересное: http://stackoverflow.com/questions/735317/hashtable-dictionary-collisions –
Хеш коды не являются уникальными. Их просто не может быть, потому что возможны более строгие значения, даже в строках «Длина» 3 ((2^16)^3 = 2^48), чем возможные хэши (2^32). –
Реализации 'GetHashCode' оптимизированы для скорости, а не для уникальности. Если вы хотите минимизировать риск столкновений, вместо этого используйте криптографическую функцию (например, SHA). – Douglas