Я задаюсь вопросом о качестве хеша и устойчивости хеша, произведенной String.GetHashCode()
реализация в.NET?
Относительно качества я фокусируюсь на алгоритмических аспектах (следовательно, качество хеша, поскольку это влияет на большие хеш-таблицы, не для проблем безопасности).
Затем относительно устойчивости, я задающийся вопросом о потенциальных проблемах управления версиями, которые могли бы явиться результатом одной версии.NET к следующему.
Некоторые световые сигналы на тех двух аспектах очень ценились бы.
Я не могу дать вам какие-либо подробности о качестве (хотя я бы предположил, что это довольно хорошо, учитывая, что строка является одним из основных классов структуры, которые, вероятно, будут использоваться в качестве хеш-ключа ).
Однако, касающиеся устойчивости, код хеша, создаваемого на разных версиях структуры, не гарантированно совпадает, и он изменился в прошлом, поэтому вы абсолютно не должны полагаться на хеш-код, являющийся стабильным между версиями ( См. Здесь для ссылки на то, что он изменился от 1,1 до 2,0 ). На самом деле, он даже отличается между 32-разрядными и 64-битными версиями и то же Framework version; Из документов :
Значение, возвращаемое gethashCode, зависит от платформы. Для определенного строкового значения он отличается на 32-разрядных и 64-битных версиях .NET Framework.
Качество хэш-кодов достаточно хороши для их предполагаемого назначения, то есть они не вызывают слишком много столкновений, когда вы используете строки в качестве ключа в словаре. Я подозреваю, что это будет использовать всю строку только для расчета хэш-кода, если длина строки достаточно короткая, для огромных струн, которые он может использовать только первую часть.
Нет никакой гарантии на устойчивость к версиях. Документация четко говорит, что алгоритм хеширования может измениться из одной версии к следующему, так что хеш-коды предназначены для краткосрочного использования.
Идеальное решение было бы совместимым с кросс-браузером, и это предложение не является; Я протестировал его только на 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-Если выборка выполняется с заменой, используйте метод выбора колеса рулетки (часто используется в генетических алгоритмах):
[0,1] * totalWeight
k
раз Если выборка не заменена, вы можете адаптировать вышеупомянутый метод, удаляя выбранный элемент из списка после каждой итерации, затем повторно нормализуют веса таким образом, чтобы их сумма равнялась 1 (действительная функция распределения вероятности)
-121--899416-Я только что столкнулся с проблемой, связанной с этим. На одном из моих компьютеров (64-разрядном) у меня была проблема, что я отследил до 2 различных объектов, идентичных, за исключением (сохраненного) хэш-кода. Этот хэш-код был создан из последовательности.... той же последовательности!
m _ storedhash = string. GetHashCode ();
Я не знаю, как эти два объекта оказались с различными хеш-кодами, учитывая, что они были из одной и той же последовательности, однако я подозреваю, что произошло в пределах одного .NET exe, один из проектов библиотеки классов, от которого я зависим, был установлен в x86, а другой - в ANYCPU, и один из этих объектов был создан в методе внутри класса x86 lib и другого объекта (те же входные данные, то же самое) были созданы в методе внутри библиотеки классов ANYCPU.
Таким образом, это звучит правдоподобно: в одном и том же исполняемом файле памяти (не между процессами) часть кода может выполняться со последовательностью x86 Framework. GetHashCode () и другой код x64 Рамки последовательности. GetHashCode ()?
Я знаю, что на самом деле это не включает значения качества и стабильности, которые вы указали. , но стоит помнить, что хеширование очень больших строк может привести к исключению OutOfMemoryException.