GetHashCode () дает разные результаты на разных серверах? - PullRequest
12 голосов
/ 24 мая 2011

Я объявил строку кода C # примерно так:

int hashcode = "apple".GetHashCode();

На моем компьютере, компьютере на работе и компьютере друга результат был 1657858284. На сервере разработки результат был 1548091822.Есть ли способ, чтобы я сказал проекту, чтобы GetHashCode () всегда выдавал 1657858284, независимо от того, на каком сервере он находится?

больше заметок Сначала я заметил разницув версиях ... 1657858284 результаты пришли из .NET 3.5 и .NET 4.0.1548091822 пришли из .NET 2.0.

Затем я сказал Visual Studio 2010 скомпилировать проект как проект .net 2.0, но он все равно дал мне 1657858284.

Ответы [ 4 ]

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

Как уже отмечали другие, это соответствует документации.Вы не должны полагаться на то, что GetHashCode всегда возвращает одно и то же.Единственный инвариант, на который вы можете положиться, это то, что будет возвращать то же значение для того же объекта в том же домене приложения, если объект не был изменен каким-либо образом, который изменяет его семантику равенства .Если какое-либо из этих условий не выполняется - если два объекта находятся в разных доменах приложения или объект был изменен таким образом, что изменяет его семантику равенства - то у вас нет никаких гарантий, что «идентичные» объекты вернут один и тот же хешcode.

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

Смотрите мой архив статей о проблемах хеширования, если вас интересует эта тема:

http://blogs.msdn.com/b/ericlippert/archive/tags/hashing/

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

Возможно, вы используете 2 разные версии .Net. Такое поведение отмечено в статье MSDN:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
Из замечаний:

Реализация по умолчанию метода GetHashCode не гарантирует уникальные возвращаемые значения для различных объектов. Кроме того, .NET Framework не гарантирует реализацию по умолчанию метода GetHashCode, и возвращаемое значение будет одинаковым для разных версий .NET Framework. Следовательно, реализация по умолчанию этого метода не должна использоваться в качестве уникального идентификатора объекта для целей хеширования.

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

Чтобы ваши пользовательские классы возвращали стабильный хеш-код, вы должны переопределить метод GetHashCode (), иначе будет использован метод GetHashCode класса Object, который, я думаю, может сильно варьироваться.(Может даже быть конкретным экземпляром).

1 голос
/ 02 июня 2011

Если вам нужна контрольная сумма, которая, например, позволяет быстро проверить целостность данных при транспортировке, просто запустите ее (криптографический) хеш с соответствующим числом битов, например

- MD5
- SHA256
- SHA1
- fletcher

.Net's *Значение 1004 * не предназначено для идентификации чего-либо (32 бита в любом случае приведут к коллизиям очень скоро, поэтому вы не сможете использовать его для идентификации строки в любом случае.)

Обратите внимание, что даже приведенные выше четыре позволятстолкновения (но не скоро);поэтому обязательно только используйте его как контрольную сумму, а не как идентификацию.

...