Качество хеша и устойчивость Строки. GetHashCode () в.NET?

Я задаюсь вопросом о качестве хеша и устойчивости хеша, произведенной String.GetHashCode() реализация в.NET?

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

Затем относительно устойчивости, я задающийся вопросом о потенциальных проблемах управления версиями, которые могли бы явиться результатом одной версии.NET к следующему.

Некоторые световые сигналы на тех двух аспектах очень ценились бы.

17
задан Joannes Vermorel 20 January 2010 в 08:39
поделиться

4 ответа

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

Однако, касающиеся устойчивости, код хеша, создаваемого на разных версиях структуры, не гарантированно совпадает, и он изменился в прошлом, поэтому вы абсолютно не должны полагаться на хеш-код, являющийся стабильным между версиями ( См. Здесь для ссылки на то, что он изменился от 1,1 до 2,0 ). На самом деле, он даже отличается между 32-разрядными и 64-битными версиями и то же Framework version; Из документов :

Значение, возвращаемое gethashCode, зависит от платформы. Для определенного строкового значения он отличается на 32-разрядных и 64-битных версиях .NET Framework.

19
ответ дан 30 November 2019 в 11:52
поделиться

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

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

0
ответ дан 30 November 2019 в 11:52
поделиться

Идеальное решение было бы совместимым с кросс-браузером, и это предложение не является; Я протестировал его только на Ubuntu 9.10, хотя с Chrome, Firefox, Epiphany и Opera и, похоже, надежно работает в них, что подразумевает надежность в их Windows аналогах. Очевидно, что IE - это совершенно другой чайник рыбы.

При этом:

Эта идея основана на следующем (x) html:

<form>
    <fieldset>
        <button disabled title="this is disabled">disabled button</button>
    </fieldset>    
</form>

И использует следующий CSS для достижения чего-то близкого к вашей цели:

button  {
    position: relative;
}

button:hover:after {
    position: absolute;
    top: 0;
    left: 75%;
    width: 100%;
    content: attr(title);
    background-color: #ffa;
    color: #000;
    line-height: 1.4em;
    border: 1px solid #000;
}

 кнопка {позиция: relative; размер рамки: рамка;} кнопка: наведение: после {позиция: absolute; вверху: 0; слева: 75%; ширина: 100%; содержание: attr (заголовок); фон-цвет: # ffa; цвет: # 000; линия-высота: 1.4em; граница: 1рх твердое вещество # 000; box-shadow: 2px 2px 10px # 999;} 
 < form > < fieldset > < button disabled title = «this is disabled» > отключенная кнопка    

Она не идеальна, но это была лучшая идея, не связанная с JavaScript.

-121--1134026-

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

  1. сортировать веса
  2. вычислить кумулятивные веса
  3. выбрать случайное число в [0,1] * totalWeight
  4. найдите интервал, в котором это число попадает в
  5. , выберите элементы с соответствующим интервалом
  6. повтор k раз

alt text

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

-121--899416-

Я только что столкнулся с проблемой, связанной с этим. На одном из моих компьютеров (64-разрядном) у меня была проблема, что я отследил до 2 различных объектов, идентичных, за исключением (сохраненного) хэш-кода. Этот хэш-код был создан из последовательности.... той же последовательности!

m _ storedhash = string. GetHashCode ();

Я не знаю, как эти два объекта оказались с различными хеш-кодами, учитывая, что они были из одной и той же последовательности, однако я подозреваю, что произошло в пределах одного .NET exe, один из проектов библиотеки классов, от которого я зависим, был установлен в x86, а другой - в ANYCPU, и один из этих объектов был создан в методе внутри класса x86 lib и другого объекта (те же входные данные, то же самое) были созданы в методе внутри библиотеки классов ANYCPU.

Таким образом, это звучит правдоподобно: в одном и том же исполняемом файле памяти (не между процессами) часть кода может выполняться со последовательностью x86 Framework. GetHashCode () и другой код x64 Рамки последовательности. GetHashCode ()?

2
ответ дан 30 November 2019 в 11:52
поделиться

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

https://connect.microsoft.com/VisualStudio/feedback/details/517457/stringcomparers-gethashcode-string-throws-outofmemoryexception-with-plenty-of-ram-available

2
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: