Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос про алгоритм CRC32

11K
07 января 2011 года
zheka3
27 / / 28.11.2006
Пусть нам даны две строки:
 
Код:
a = "hello";
b = "world";


Посчитаем хеши этих строк по алгоритму CRC32:
 
Код:
hash_a = CRC32(a);
hash_b = CRC32(b);


Вопрос: возможно ли найти хеш строки, полученной с помощью конкатенации двух строк a и b (т. е. c="helloworld"), зная только хеши исходных строк hash_a и hash_b?
241
08 января 2011 года
Sanila_san
1.6K / / 07.06.2005
hello = 3d653119
world = cb7bce59
helloworld = 00456b75

Вот вам и ответ.
1.8K
09 января 2011 года
LM(AL/M)
332 / / 20.12.2005
вобще-то это не ответ. Как я понял вопрос состоит в том, существует ли функция f(x, y) такая что hash(a * b) = f( hash(a), hash(b) ) для любых a и b. С точки зрения чистой математики такая функция безусловно существует, но на практике задать ее вид довольно трудно и скорее всего вычислительная сложность такой функции не будет лучше чем у CRC32...
8.2K
09 января 2011 года
bagie2
299 / / 26.10.2008
насколько я понимаю напишу.

crc32 не обратима (хотя вроде последние 4 байта можно восстановить) (и это даже не хэш) и чтобы получить crc32("helloworld") можно посчитать crc32("world") с вектором инициализации равному crc32("hello")
то есть, грубо говоря, нам всё равно нужна часть plaintext, в данном случае кусочек "world".
8.2K
09 января 2011 года
bagie2
299 / / 26.10.2008
и вообще может это вам пригодится как-то, самому стало интересно и сделал пример.
63
11 января 2011 года
Zorkus
2.6K / / 04.11.2006
C точки зрения математики как раз такой функции в общем виде НЕ существует.

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

Если бы такие операции над хэшами были возможны, вся криптография и контроль целостности бы не существовали.
1.8K
12 января 2011 года
LM(AL/M)
332 / / 20.12.2005
Цитата: Zorkus
C точки зрения математики как раз такой функции в общем виде НЕ существует.


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

63
12 января 2011 года
Zorkus
2.6K / / 04.11.2006
А, вот вы про что.

Тогда уточните, в вашей формуле hash() - фиксированная функция, или произвольная?

Вообще, может теоритически такая функция и существует. Но практически для любой сильной хэш функции я думаю не существует алгоритма (разумно быстрого) который бы вычислял hash (a + b) через hash(a), hash(b).
11K
13 января 2011 года
zheka3
27 / / 28.11.2006
Спасибо всем кто откликнулся.

Цитата: bagie2

насколько я понимаю напишу.
чтобы получить crc32("helloworld") можно посчитать crc32("world") с вектором инициализации равному crc32("hello")



Я тоже так решил сделать, и не заморачиваться в дальнейших поисках.
Необходимо было реализовать алгоритм LZW. Для поиска по словарю я использовал хеш-таблицу. Работало за приемлемое время, но все-таки решил оптимизировать. Запросы в хеш-таблицу представляют собой find(string+character).
Слабое место было в том, что каждый раз считался хеш строки заново. Когда я кешировал хеши строк, и уже вычислял не полностью string+character, а только crc32(character), получил заметный прирост производительности.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог