задача такая — восстановить строку по хэшу ( собственно сабж )
понятно, что самый простой вариант — это иметь хэши от сочетания знаков в строке ( или перебирать все сочетания знаков ) до совпадения ,
но — нет ли возможности как нибудь хитро составлять хэш или некое подобие, чтобы облегчить восстановление по нему?
С учетом того сто строка — набор 2х байтовых символов (100 — 300 шт) ( не алфавит а уникальные, скажем ИД ) ,
а хэш может быть 2-4 байта .
C>задача такая — восстановить строку по хэшу ( собственно сабж ) C>понятно, что самый простой вариант — это иметь хэши от сочетания знаков в строке ( или перебирать все сочетания знаков ) до совпадения , C>но — нет ли возможности как нибудь хитро составлять хэш или некое подобие, чтобы облегчить восстановление по нему? C>С учетом того сто строка — набор 2х байтовых символов (100 — 300 шт) ( не алфавит а уникальные, скажем ИД ) , C>а хэш может быть 2-4 байта . C>спасибо.
Здравствуйте, carpenter, Вы писали:
C>задача такая — восстановить строку по хэшу ( собственно сабж ) C>понятно, что самый простой вариант — это иметь хэши от сочетания знаков в строке ( или перебирать все сочетания знаков ) до совпадения , C>но — нет ли возможности как нибудь хитро составлять хэш или некое подобие, чтобы облегчить восстановление по нему?
Не понятно, что же нужно сделать, по заданной хеш-функции f и хешу h найти строку s такую, что f(s) = h, или подобрать такую хеш-функцию, чтобы первая задача легко решалась?
Классический подход к решению первой задачи — Rainbow table.
Вторая же задача делается совсем просто: выбирается либо тривиальная хеш-функция h(s) → s, которая элементарно инвертируется, либо выбирается вырожденная хеш-функция h(s) → 0, для которой искомая строка так же элементарно получается.
Здравствуйте, carpenter, Вы писали:
C>задача такая — восстановить строку по хэшу ( собственно сабж )
... C>С учетом того сто строка — набор 2х байтовых символов (100 — 300 шт) ( не алфавит а уникальные, скажем ИД ) , C>а хэш может быть 2-4 байта .
Так по хэшу максимум что можно найти — это множество строк. Это примерно как с неопределенным интегралом.
Можно хэш-функцию взять по первым 4-ём байтам, и весь набор генерить перебором оставшейся части.
А вообще странное желание
C>задача такая — восстановить строку по хэшу ( собственно сабж )
нужно понимать, что одному хешу может соответствовать несколько строк
какую именно вы строку хотите получить?
сформулируйте задачу четче
C>задача такая — восстановить строку по хэшу ( собственно сабж ) C>понятно, что самый простой вариант — это иметь хэши от сочетания знаков в строке ( или перебирать все сочетания знаков ) до совпадения , C>но — нет ли возможности как нибудь хитро составлять хэш или некое подобие, чтобы облегчить восстановление по нему? C>С учетом того сто строка — набор 2х байтовых символов (100 — 300 шт) ( не алфавит а уникальные, скажем ИД ) , C>а хэш может быть 2-4 байта .
C>спасибо.
Во-первых тк функция хеширования отражает бесконечно большое множество последовательностей символов в ограниченное множество хэшей задача обращения не возможна. Но есть задача поиска коллизий.
Во вторых вы не указали саму хеш-функцию, тк например поиск коллизий для криптографических хешей кроме как полным перебором (за исключением rainbow tables, но считайте это тоже брутфорс =) ) невозможен. С другой стороны для простых хешей есть разные методики подбора.