Метод GetHashCode() дает разные результаты на разных серверах?
Я объявил строку кода C#, как so
int hashcode = "apple".GetHashCode();
на моем компьютере, компьютере на работе и компьютере друга результат был 1657858284. На сервере разработки результатом было 1548091822. Есть ли способ для меня сказать проекту всегда делать GetHashCode () доходностью 1657858284, независимо от того, на каком сервере он находится?
заметки Сначала я заметил разницу в версиях...результаты 1657858284 пришли из .NET 3.5 и .NET 4.0. 1548091822 пришел из .NET 2.0.
затем я сказал visual studios 2010 скомпилировать проект как проект .net 2.0, но он все равно дал мне 1657858284.
4 ответов
возможно, что вы используете 2 разные версии .Сеть.
Это поведение отмечено на MSDN article:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
Из замечаний:
реализация метода GetHashCode по умолчанию не гарантирует уникальных возвращаемых значений для различных объектов. Кроме того, платформа .NET Framework не гарантирует реализацию метода GetHashCode по умолчанию, и значения, возвращаемые же в разных версиях .Чистые рамки. Следовательно, реализация этого метода по умолчанию не должна использоваться в качестве уникального идентификатора объекта для целей хэширования.
Как отметили другие, это соответствует документации. Вы не должен полагайтесь на GetHashCode, возвращающий то же самое, когда-либо. Единственный инвариант, на который вы можете положиться, - это он вернет то же значение для того же объекта в том же appdomain, если объект не был мутирован каким-либо образом, который изменяет его семантику равенства. Если какое-либо из этих условий не выполняется-если два объекта находятся в разных appdomains, или объект был мутирован таким образом это изменяет его семантику равенства - тогда у вас нет никакой гарантии, что "идентичные" объекты вернут тот же хэш-код.
единственное, для чего вы должны использовать хэш-код, - это сбалансировать хэш-таблицу. любое другое использование "с ярлыка" и на ваш собственный риск. Не делай этого. Если вам нужен стабильный строковый хэш, который работает через произвольные границы, используйте стандартный алгоритм, такой как SHA256 или что-то еще.
см. мой архив статей о вопросах хэширования для более подробной информации, если эта тема вас интересует:
для ваших пользовательских классов для возврата стабильного хэш-кода Вы должны переопределить метод GetHashCode () или иначе будет использоваться метод GetHashCode класса Object, который, я думаю, может сильно отличаться. (Может быть, даже конкретный экземпляр).
Если вам нужна контрольная сумма, которая, например, позволяет быстро проверить целостность данных в транспорте, просто запустите ее через (криптографический) хэш с соответствующим количеством бит, как
- MD5
- SHA256
- SHA1
- fletcher
.Net GetHashCode
не предназначен для идентификации чего-либо (32 бита в любом случае приведут к столкновениям очень скоро, поэтому вы не можете использовать его для идентификации строки в любом случае.)
обратите внимание, что даже вышеупомянутые четыре позволят столкновения (но менее скоро); поэтому обязательно только используйте его как контрольную сумму, а не идентификацию.