Действительно ли возможно объединить хэш-коды для членов парламента, не занимающих официального поста для генерации нового хэш-кода?

Вы также можете написать так же

$(function() {
    $("#checkbox-toggle").click(function() {
        $('input[type=checkbox][name=checkbox_id\\[\\]]').click();
    });
});

Просто нужно вызвать событие щелчка для флажка, когда пользователь нажимает кнопку с идентификатором «# checkbox-toggle».

17
задан Adrian Hope-Bailie 3 July 2009 в 12:53
поделиться

4 ответа

Основные принципы указаны от Марка и Джона неплохие, но они далеки от оптимальности с точки зрения равномерности распределения результатов. К сожалению, подход «умножения на простые числа», скопированный таким количеством людей из Knuth, не лучший выбор во многих случаях лучшего распределения можно добиться за счет более дешевых вычислений функций (хотя это очень немного на современном оборудовании). На самом деле использование простых чисел во многих аспектах хеширования не панацея .

Если эти данные используются для хэш-таблиц значительного размера, я рекомендую прочитать Bret Mulvey '

24
ответ дан 30 November 2019 в 10:43
поделиться

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

Простое добавление, как правило, не является хорошей идеей, а разделение - определенно нет. Вот подход, который я обычно использую:

int result = 17;
foreach (string item in collection)
{
    result = result * 31 + item.GetHashCode();
}
return result;

Если вы в противном случае находитесь в проверяемом контексте, вы можете намеренно снять его.

Обратите внимание, что это предполагает, что порядок важен, то есть что {"a", "b"} должны отличаться от { "б", "а"}. Сообщите нам, если это не так.

24
ответ дан 30 November 2019 в 10:43
поделиться

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

  1. Хэш-код частных членов не должен изменяться в течение всего времени существования объекта.
  2. Контейнер не должен изменять объект, на который указывают частные члены, чтобы он, в свою очередь, не изменил хэш-код контейнера.
1
ответ дан 30 November 2019 в 10:43
поделиться

Если порядок элементов не важен (т. Е. {"A", "b"} совпадает с {"b", "a"}), вы можете использовать исключительный или для объединения хеш-кодов:

hash ^= item.GetHashCode();

[Изменить: как Марк указал в комментарии к другому ответу, у этого есть недостаток, заключающийся в том, что для таких коллекций, как {"a"} и {"a", "b", "b"} один и тот же хэш-код .]

Если порядок важен, вы можете вместо этого умножить на простое число и добавить:

hash *= 11;
hash += item.GetHashCode();

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

1
ответ дан 30 November 2019 в 10:43
поделиться
Другие вопросы по тегам:

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