Является ли функция хеш-функции .NET переносимой?
Возможный дубликат:
Как создать HashCode в .net(С#) для строки, безопасной для хранения в базе данных?
Я использую С# 4.0 и получаю хэш строки, вызывая:
"my string".GetHashCode()
Код, сгенерированный этим вызовом, сохраняется в базе данных для будущего использования. Этот хэш-код используется для поиска некоторого подмножества строк, а затем для сравнения.
Вопросы:
- Это стандартизованный хеш-расчет? Могу ли я предположить, что это
можно вычислить один и тот же хеш в разных средах, таких как С#, в .Net 3.0 или будущих версиях .Net?
- Можно ли вычислить одну и ту же функцию хэша на себе, записав ее в Java, PL/SQL, Ruby и т.д.
- Можно ли предположить, что хэш, созданный сегодня, будет таким же завтра в
в той же среде? Например, когда я выключаю компьютер и
снова запустить программу или изменить языковой стандарт или некоторые другие параметры?
- Каковы пределы переносимости?
- Я знаю, что могу сделать это сам, но возможно ли какая-то мобильность?
Ответы
Ответ 1
Из MSDN:
Реализация метода GetHashCode по умолчанию не гарантирует уникальные возвращаемые значения для разных объектов. Кроме того,.NET Framework не гарантирует стандартную реализацию метода GetHashCode, и возвращаемое значение будет одинаковым для разных версий .NET Framework. Следовательно, реализация этого метода по умолчанию не должна использоваться как уникальный идентификатор объекта для целей хэширования.
Нет, вы не можете предположить, что значение, созданное GetHashCode
, является стабильным. Это не просто теоретическое - мы видели изменение стоимости в прошлом.
Если вам нужен стабильный хэш, вам придется его самостоятельно создать.
Ответ 2
Правило. Потребители GetHashCode не могут полагаться на то, что они стабильны с течением времени или через приложения.
Ответ 3
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
.NET Framework не гарантирует стандартную реализацию метод GetHashCode и возвращаемое значение будут одинаковыми между различными версиями .NET Framework. Следовательно, реализация этого метода по умолчанию не должна использоваться как уникальная Идентификатор объекта для целей хеширования.
Ответ 4
Нет. Он не переносится. Вы никогда не должны использовать этот метод для чего-либо, кроме балансировки дерева хэшей. его реализация изменилась между версиями Framework и ведет себя по-разному для 32-разрядной/64-разрядной CLR.
Эрик Липперт имеет сообщение в блоге о правилах и правильном использовании этой функции.
Вместо этого вы должны использовать SHA1Managed
для вставки хэша в базу данных.