Будет ли string.GetHashCode() возвращать отрицательное значение?

Я пробовал с пакетом случайных строк, все значения, которые я получил, положительные, но мне интересно:

Будет ли String.GetHashCode() возвращать отрицательное значение или 0?

Поскольку возвращаемое значение равно int, я предполагаю, что это может быть так, поэтому, если это так, я должен изменить свою логику.

Если у вас есть ответ или есть какие-то официальные источники, пожалуйста, поделитесь


person Eric Yin    schedule 31.01.2012    source источник
comment
К вашему сведению, GetHashCode является частью .NET, а не частью С#.   -  person John Saunders    schedule 31.01.2012
comment
Глядя на логику через Reflector, я бы сказал так.   -  person leppie    schedule 31.01.2012
comment
blogs.msdn. com/b/ericlippert/archive/2011/02/28/   -  person SLaks    schedule 31.01.2012
comment
blogs.msdn.com/b/ericlippert/archive/2005/10/24/   -  person SLaks    schedule 31.01.2012
comment
vkreynin.wordpress.com/2008/07/05/explaining-getashcode -method проверьте это :)   -  person Ravi Gadag    schedule 31.01.2012
comment
Вы, вероятно, видели бы отрицательные результаты при выборке строки (сильно) различной длины.   -  person Henk Holterman    schedule 31.01.2012
comment
Тогда вы выбрали нетипичную партию случайных строк.   -  person Eric Lippert    schedule 31.01.2012


Ответы (2)


Да, он может возвращать отрицательные значения.

Вы не должны иметь какую-либо логику, которая работает со значениями GetHashCode().
Уникальность GetHashCode() не гарантируется и может изменяться между сборками.

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

person SLaks    schedule 31.01.2012
comment
SLaks прав, особенно между 32-битной и 64-битной архитектурами. - person Chris Barlow; 31.01.2012
comment
вау, он меняется между сборками, это отстой, мне нужно использовать что-то еще, все равно спасибо :) - person Eric Yin; 31.01.2012
comment
Да; вы должны использовать что-то еще. GetHashCode() предназначен только для хеш-таблиц в памяти. Вероятно, вам следует использовать SHA512. - person SLaks; 31.01.2012
comment
@Barlow, так что, если я буду постоянно строить на x64, значение не изменится, верно? Как насчет x128, в конце концов у нас будет - person Eric Yin; 31.01.2012
comment
@EricYin: НЕ ДЕЛАЙТЕ ЭТОГО! См. blogs.msdn.com/b/ericlippert/archive/2005/10/24/ - person SLaks; 31.01.2012
comment
@Slaks, конечно, я буду придерживаться своего SHA512, в любом случае это очень просто и быстро в .NET. - person Eric Yin; 31.01.2012
comment
@SLaks, что, если я просто хочу получить семя для моего генератора случайных чисел. Я просто не могу использовать Guid.NewGuid().GetHashCode(); ? - person Teoman shipahi; 08.06.2017
comment
@Teomanshipahi: Если вас не волнуют безопасность или предсказуемость, все в порядке. Если это вообще связано с криптографией, вы должны использовать безопасный PRNG. - person SLaks; 08.06.2017
comment
Обновлен рабочий URL-адрес сообщения в блоге Эрика Липперта: blogs.msdn.microsoft.com/ericlippert/2005/10/24/ - person Raj Rao; 07.04.2020

Он может возвращать отрицательное значение (на основе msdn):
http://msdn.microsoft.com/en-us/library/system.string.getashcode.aspx

person cichy    schedule 31.01.2012