Метод хеширования на несколько значений? - PullRequest
4 голосов
/ 11 марта 2011

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

// group all objects with a common parent_id, date, and type
foreach ($objects as $obj) {
    $hash = $obj->parent_id . '_' . $obj->date  . '_' . $obj->type;
    $sorted_objects[$hash][] = $obj;
}

... Ик! Должен быть лучший способ, чем злоупотреблять произвольной типизацией PHP и конкатенацией строк. Есть ли способ выполнить хэш для нескольких значений? Кажется, я должен быть в состоянии сделать что-то вроде этого:

$hash = sha1_multiple($obj->parent-id, $obj->date, $obj->type);

Я уже использую лучший метод или есть лучший способ?

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

Использование сериализации PHP делает его немного более аккуратным, но менее эффективным:

function sha1_multiple() {
    $args = func_get_args();
    return sha1(serialize($args));
}
3 голосов
/ 11 марта 2011

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

0 голосов
/ 26 сентября 2018

В concat-then-hash хеш "Jim" и "Fisher" является хешем "JimFisher". Обращение входных данных приводит к созданию хеша «FisherJim», отдельной строки, поэтому он не уязвим для атаки путем переупорядочения входных данных. Является ли concat-then-hash неуязвимым для атаки вторым прообразом? Можете ли вы найти пример другого входа, который сталкивается с hash2_concat_then_hash («Джим», «Фишер»)? Опять же, вам не нужно грубой силы! Одним из примеров является hash2_concat_then_hash ("Ji", "mFisher"), потому что "Ji" и "mFisher" также объединяются с "JimFisher".

Для получения дополнительной информации взгляните на how-to-hash-множественные значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...