Почему XOR часто используются в хэш-коде Java (), но другой побитовые операторы редко используется?

Я часто вижу код как

int hashCode(){
  return a^b;
}

Почему XOR?

47
задан Andrei N 25 February 2010 в 13:21
поделиться

3 ответа

Как вы, кажется, знаете, опускать два ряды и сравнивать их - это не то же самое, что делать сравнение без учета случая. Этому есть масса причин. Например, стандарт Юникода позволяет кодировать текст с диакритическими знаками несколькими способами. Некоторые символы включают в себя как базовый символ, так и диакритический знак в одной кодовой точке. Эти символы также могут быть представлены в виде базового символа, за которым следует комбинирующий диакритический символ. Эти два представления одинаковы для всех целей, и сравнение последовательностей с учетом культуры в .NET Framework правильно идентифицирует их как равные либо с CurrentCulture, либо с InvariantCulture (с IgnureCase или без него). Порядковое сравнение, с другой стороны, неверно расценивает их как неравные.

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

То, что я делал в прошлом, чтобы получить правильное поведение, просто имитирует мое собственное утверждение о переключении. Есть много способов сделать это. Одним из способов является создание списка < T > пар последовательностей обращения и делегатов. Список можно найти с помощью правильного сравнения последовательностей. При обнаружении совпадения может быть вызван связанный делегат.

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

Замечательно то, что при сравнении со последовательностями не существует каких-либо ограничений по производительности при создании собственных функциональных возможностей коммутатора. Система не собирается делать таблицу перехода O (1) путь она может с целыми числами, так что она будет сравнивать каждую строку по одной за раз.

Если требуется сравнить много случаев, и производительность является проблемой, то описанный выше параметр List < T > можно заменить на отсортированный словарь или хэш-таблицу. Тогда производительность может потенциально соответствовать параметру оператора switch или превышать его.

Вот пример списка делегатов:

delegate void CustomSwitchDestination();
List<KeyValuePair<string, CustomSwitchDestination>> customSwitchList;
CustomSwitchDestination defaultSwitchDestination = new CustomSwitchDestination(NoMatchFound);
void CustomSwitch(string value)
{
    foreach (var switchOption in customSwitchList)
        if (switchOption.Key.Equals(value, StringComparison.InvariantCultureIgnoreCase))
        {
            switchOption.Value.Invoke();
            return;
        }
    defaultSwitchDestination.Invoke();
}

Конечно, вы, вероятно, захотите добавить некоторые стандартные параметры и, возможно, возвращаемый тип к делегату CustomSwitchDestination. И ты захочешь сделать имена получше!

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

    if (s.Equals("house", StringComparison.InvariantCultureIgnoreCase))
    {
        s = "window";
    }
    else if (s.Equals("business", StringComparison.InvariantCultureIgnoreCase))
    {
        s = "really big window";
    }
    else if (s.Equals("school", StringComparison.InvariantCultureIgnoreCase))
    {
        s = "broken window";
    }
-121--910229-

Эта версия кода сделает u, чтобы получить даты праздников из базы данных sql и отключить указанную дату в UI Datepicker


$(document).ready(function (){
  var holiDays = (function () {
    var val = null;
    $.ajax({
        'async': false,
        'global': false,
        'url': 'getdate.php',
        'success': function (data) {
            val = data;
        }
    });
    return val;
    })();
  var natDays = holiDays.split('');

  function nationalDays(date) {
    var m = date.getMonth();
    var d = date.getDate();
    var y = date.getFullYear();

    for (var i = 0; i ‘ natDays.length-1; i++) {
    var myDate = new Date(natDays[i]);
      if ((m == (myDate.getMonth())) && (d == (myDate.getDate())) && (y == (myDate.getFullYear())))
      {
        return [false];
      }
    }
    return [true];
  }

  function noWeekendsOrHolidays(date) {
    var noWeekend = $.datepicker.noWeekends(date);
      if (noWeekend[0]) {
        return nationalDays(date);
      } else {
        return noWeekend;
    }
  }
  $(function() { 
    $("#shipdate").datepicker({
      minDate: 0,
      dateFormat: 'DD, d MM, yy',
      beforeShowDay: noWeekendsOrHolidays,
      showOn: 'button',
      buttonImage: 'images/calendar.gif', 
      buttonImageOnly: true
     });
  });
});

Создайте базу данных в sql и поместите праздничные даты в формат MM/DD/YYYY как Varchar Поместите приведенное ниже содержимое в файл getdate.php


[php]
$sql="SELECT dates FROM holidaydates";
$result = mysql_query($sql);
$chkdate = $_POST['chkdate'];
$str='';
while($row = mysql_fetch_array($result))
{
$str .=$row[0].'';
}
echo $str;
[/php]

Happy Coding!!!!: -)

-121--620454-

Из всех бит-Операции XOR имеют лучшие свойства тасования битов.

В этой таблице истинности объясняется, почему:

A B AND
0 0  0
0 1  0
1 0  0
1 1  1

A B OR
0 0  0
0 1  1
1 0  1
1 1  1

A B XOR
0 0  0
0 1  1
1 0  1
1 1  0

Как вы видите для И и ИЛИ плохо справляются со смешиванием битов.

ИЛИ будет в среднем производить 3/4 один бит. И, с другой стороны, будет производить в среднем 3/4 нулевых битов. Только XOR имеет четное однобитовое или нулевое битовое распределение. Это делает его таким ценным для генерации хеш-кода.

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

89
ответ дан 26 November 2019 в 19:26
поделиться

XOR имеет следующие преимущества:

  • Он не зависит от порядка вычислений, т.е. a^b = b^a
  • Он не "тратит" биты. Если вы измените хотя бы один бит в одном из компонентов, конечное значение изменится.
  • Это быстро, один цикл даже на самом примитивном компьютере.
  • Он сохраняет равномерное распределение. Если две части, которые вы объединяете, распределены равномерно, то и комбинация будет равномерной. Другими словами, она не стремится сжать диапазон дайджеста в более узкую полосу.

Больше информации здесь.

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

Оператор XOR является обратимым, т.е. предположим, у меня есть битовая строка 0 0 1, и я делаю XOR с другой битовой строкой 1 1 1 1, на выходе получается

0 xor 1 = 1
0     1 = 1
1     1 = 0

Теперь я могу снова сделать xor первой строки с результатом, чтобы получить вторую строку. т.е.

0   1 = 1
0   1 = 1
1   0 = 1

Таким образом, вторая строка становится ключом. Такое поведение не встречается с другими битовыми операторами

Пожалуйста, посмотрите это для получения дополнительной информации --> Почему XOR используется в криптографии?

4
ответ дан 26 November 2019 в 19:26
поделиться
Другие вопросы по тегам:

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