Подтвердить что ты не робот

Есть ли способ сделать .NET Core GetHashCode детерминированным?

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

Сказав все это, Im в настоящее время отлаживает сложный код, который сильно использует GetHashCode. Я знаю, что ошибка - это мое собственное дело и не имеет ничего общего с GetHashCode, но каждый раз, когда я запускаю его, он не работает в другом месте. Очень надоедливый. Есть ли способ заставить GetHashCode вести себя как в .NET(при отладке Im), не имея необходимости писать собственную хеш-функцию и заменять ее везде в моем коде?

4b9b3361

Ответ 1

Прагматическое решение, которое я нашел, чтобы получить string.GetHashCode, чтобы вернуть предикативные значения для нескольких исполнений, - это просто вернуться к классическому .NET(4.6). Поскольку .NET Core не имеет особого значения для моего кода, единственной работой, которую я должен был сделать, является создание нового проекта. Я отлаживал свой код под .NET 4.6, исправлял ошибку и переключился на Core.

Ответ 2

Согласно документам, только изменение структуры должно изменить результат хеширования. Я тоже наткнулся на это. Моим решением было создать мой собственный алгоритм хэширования. Это заняло несколько минут, потому что мне не нужно было ничего особенного.

private static int GetSimpleHash(string s)
{
    return s.Select(a => (int)a).Sum();
}

С другой стороны, я подал ошибку для Dotnet Core 1.1. (строка). GetHashCode() здесь.

Обновить

Хеш может измениться из-за фреймворка или домена. Это означает, что два последующих запуска одной и той же программы могут возвращать разные результаты.
Увы, мой отчет об ошибке спорен и заменен обновлением документации.

Обновить обновление

Документация обновлена, чтобы быть немного более понятной.