LINUX.ORG.RU

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

anonymous
()
Ответ на: комментарий от anonymous

Комбинаторы хэш функций известны, их свойства и потенциальные грабли изучены

А можно ссылки? Я бы почитал. Потому что в общем случае, хеш-функции не обладают дистрибутивным свойством. Т.е. hash(a) + hash(b) != hash(a+b)

hateyoufeel ★★★★★
()
Ответ на: комментарий от anonymous

А что такое «безопасность для не-криптографических применений»?
А (a<<1)^b - безопасно для криптографических применений?
По моему здесь речь идет только о применении в хеш таблицах.

Скажите мне по сути:

  1. правильно ли я описал требования к хешу для применения в хеш-таблицах:
  1. равномерная распределённость результата (при равномерной распределенности a и b)
  2. hash(a,b)!=hasb(b,a) если a!=b
  1. подходит ли каждый из перечисленных методов под эти требования

Вот только что нагуглил ещё один метод:

  • (a*p)^b, где p=17 или p=31 или другое простое число
    пойду добавлю в свой ответ…

Ради одного только hash_combine подключать boost - не вариант. А если на каком-нибудь контесте задачку решаешь, то там вообще можно использовать только стандартную библиотеку.

FeelUs
() автор топика
Последнее исправление: FeelUs (всего исправлений: 1)

никак. если хеш однонаправленная функция, то никак не вычислить её в обратном направлении.

начать надо с того, что значит фраза «двух объектов». Какой операцией, например, из двух раздельных объектов получается один слитный двухобъект?

Shushundr ★★★★
()
Ответ на: комментарий от Shushundr

структура, pair, tuple
хеш нужен чтобы комбинацию двух объектов можно было засунуть в хеш-таблицу (как ключ) и всё работало оптимально.

FeelUs
() автор топика
Последнее исправление: FeelUs (всего исправлений: 3)

В общем случае, если найти коллизии hash(a1)==hash(a2) и hash(b1)==hash(b2), то hash(a1+b1)!=hash(a2+b2). Таким образом результатов много, и он никак не зависит от хешей, а зависит только от исходных данных.

m0xf
()

Как правильно вычислить хеш двух объектов

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

hakavlad ★★★
()
Ответ на: комментарий от FeelUs

У тебя хэш функция на каком множестве определена? Изначальных объектов или их пар? ТебЯ спрашивают каким образом ты определяешь функцию комбинирования объектов, если твои объекты из множества M, то эта функция будет иметь тип M x M –> M

anonymous
()