-
Notifications
You must be signed in to change notification settings - Fork 31
Outperform wyhash #29
Comments
russian: Короткий ответ — я не знаю. Использование ядра конгруэнтного генератора является довольно очевидным подходом, и многие (в том числе и я) применяли в подобных условиях его более 20 лет назад. english: The short answer is - I don't know. The use of a congruent generator core is a fairly obvious approach, and many (including myself) used it under similar conditions more than 20 years ago. |
This formula
means that when p[0]==_wyp1, then p[1] value is completely ignored. Do you really like such construct? It's used by UMAC/FARSH/XXH3:
|
@Bulat-Ziganshin, конечно я не имел в виду повторение аналогичных "граблей". Более того, я вижу определенную проблему в функциях подобных NH из UMAC. Еще весной я сделал несколько экспериментов в направлении следующей версии t1ha, но они слишком сырые и у меня пока нет времени для доведения этих наработок до релиза. |
что-то я не понимаю. wyhash использует ту же функцию, тогда почему ты хочешь её скопировать? или речь о копировании других идей из этого хеша?
в этом коде та же самая порблема - если |
Хмм, @Bulat-Ziganshin, я точно не собирался ничего копировать (смысла нет и не красиво).
Нет, это не так. Следует обратить чуть больше внимания на детали. Кроме этого, используя 64-битные значения для |
вообще, мне такие хеши кажутся менее интересными потому что в обычных смена одного бита лавинообразно меняет всё последующее состояние, а в этих - эффект ограничивается одним слагаемым в сумме. если же мы при этом теряем ещё и скорость... |
Я бы считал иначе. Все используемые операции ассоциативны, поэтому для суперскалярного CPU реальным ограничением должна быть производительность "Execution units". Соответственно многое зависти от раскладки алгоритма в "тетрис" из инструкций.
Конечно, при условии, что K[] 64-битный массив. Однако, практика показывает, что большинство наблюдателей не замечают uint64_t в объявлении K. Поэтому я добавил явное (но избыточное) преобразование в 64-битное значение.
В MMH нет обсуждаемых проблем, там был mod 4294967311 (2^32+15) и простыми выкладками показано что "всё хорошо" (но именно для 32-битного результата после mod 4294967311). В той же работе вскользь описана NMH с тем-же mod 4294967311. Но если присмотреться: проблема нулей не упомянута, нет замечания о 64-битных сложении, но есть примечание "вдвое быстрее". В UMAC с NH пошли еще дальше - резонно выкинули модуль простого числа (так как 64-битный результат идет в SHA1 или POLY) и явно перешли на "узкое сложение". Тут логика авторов мне не совсем понятна, в том числе в близкой работе (может я что-то упускаю?). Исследуются и доказывается масса всего вокруг, но как-бы не замечается проблема игнорирования данных из-за получения нулей при сложении. Точнее говоря, проблема сводится/прячется в оценку вероятности коллизий, уровень которых приемлем "в среднем по больнице". У меня ощущение что (например) где-то потерялось примечания, о "циклическом" сложении с добавлением переноса (т.е. вместо 0 будет 1), либо это какой-то умышленный изъян. Т.е. совершенно очевидно, что зная часть ключа и не зная Nonce можно генерировать сообщения в которых HMAC не будет зависеть от некоторых 32-битных слов... С другой стороны, там есть рекомендация "для умных" использовать "Toeplitz construction" (хешировать не-единожды со сдвигом ключа), что устраняет проблему. Однако, в RFC4418 это не попало. Так вот, @Bulat-Ziganshin, для меня несколько неожиданно твое высказывание "такие хеши кажутся менее интересными", так как:
При этом, в твоём FARSH-е есть "отбеливание" (как на уровне блоков, так и финальное), но в ядре проблема нулей и без-лавинная NH-сумма (которая тебе не-нравится). Т.е. тогда тебе не должен нравится собственный "фарш"? |
смотри - этот цикл обрабатывает 8 байт входных данных и для этого загружает 4 значения. Во всех существующих x86 cpu есть от силы два Load engine, поэтому этот цикл будет выполняться два такта.
я наоборот привык к конструкциям вида
именно. Поэтому я его забросил и перешёл к разработке zzHash: Bulat-Ziganshin/FARSH#6 Далее, термины типа "всё хорошо" дезориентируют. Дело в том, что есть множество разных недостатков, разных целей и даже разных начальных условий. То что хорошо для MAC-алгоритмов - необязательно хорошо для нас (в обратную сторону это очевидно). Надо говорить конкретно что хорошо и что плохо в каждом алгоритме.
дело в том, что этот ключ (массив, передаваемый в NH) генерится по значению Nonce, например В целом, авторы статей о MAC говорят о collision probability и universality, чего нам совершенно недостаточно. Для нас важнее коллизии на "похожих" входных значениях и smhasher - это как раз генератор таких значений. Например, MMH возвращает ноль на последовательности нолей любой длины. Для неё это приемлемо, поскольку вероятность таких совпадений в мире, где все значения полагаются одинаково вероятными, мала. Для нас же это особый, достаточно вероятный случай, и нам важно чтобы таких коллизий не было. Поэтому farsh без постобработки проваливает часть тестов smhasher, а crc32 которая afair тоже как-то универсальная, проваливает 5 из 10 тестов. Ну и в целом - MAC-алгоритмы быстрее криптохешей. Почему? Потому что они опираются на неизвестный атакующему ключ, и именно случайный выбор этого неизвестного ключа даёт им гарантии оптимального числа коллизий - в среднем по всем ключам. Однако как только мы фиксируем ключ, само понятие универсальности теряет смысл и мы теряем какие-либо гарантии вообще, зато сталкиваемся с тем, что при выборе данной конкретной функции у нас есть очевидные зависимости между входными данными и значением хеш-функции. Заметь, что такие очевидные завиисимости будут при любом выборе конкретной хеш-функции из семейства, просто каждый раз разные. Для семейства в целом это ОК, а для конкретной функции - нет. |
Угу. После Nehalem именно так (ранее был один read-port). Собственно я ведь тоже само писал, только в более широкой формулировке и без привязки к x86. На других архитектурах узким местом может стать умножение и т.д.
О, теперь буду знать, и возьмусь за yyHash ;)
Видимо у меня (было) какое-то ассоциативное наложение по поводу Nonce из других мест, т.е. я считал именно как написал (а сейчас глянул внимательно и увидел).
Собственно я полностью с тобой согласен. В том числе поэтому "ноль от нулей" в случае MMH для меня выглядит приемлемым. Но вот вероятность полного игнорирования данных в NH/UMAC - уже как-бы за гранью, не говоря о XXH3. Причем ведь эти "черти" сами написали о "Toeplitz construction", а потом забили. Тем не менее, как писал, всё это IMHO. |
Obsoleted by #36 |
The text was updated successfully, but these errors were encountered: