Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simple brute-force implementation #94

Merged
merged 1 commit into from Oct 10, 2018
Merged

Simple brute-force implementation #94

merged 1 commit into from Oct 10, 2018

Conversation

@vasyan
Copy link
Contributor

@vasyan vasyan commented Oct 10, 2018

I've created a simple console-output-based brute-force script. It looks like a crypto mining now.
image

@vasyan vasyan force-pushed the vasyan:master branch from 57879d8 to 77b4aef Oct 10, 2018
@ai ai merged commit ec43400 into ai:master Oct 10, 2018
1 check passed
1 check passed
continuous-integration/travis-ci/pr The Travis CI build passed
Details
@ai
Copy link
Owner

@ai ai commented Oct 10, 2018

Я очень сильно прокачал перебор (многопоточность, отсутствие вызовов sh), но в итоге за час он смог продвинутся только на 1.071820381004764e-80 % работы.

Жалко, направление оказалось тупиковым.

@y8
Copy link

@y8 y8 commented Oct 10, 2018

Перебор такого алфавита изначально является запредельно ресурсоёмкой задачей. Если я правильно помню комбинаторику, то это факториал длинны ряда. А для 64 символьного алфавита это ~1.2*10^89. Это очень много перебора.

Задачу проще решить аналитически.

gzip это два алгоритма:

  • Lempel Ziv (lz77)
  • Huffman Coding

lz77 заменяет повторы в тексте на обратную ссылку на сегмент где встречается оригинальный сегмент.

Huffman coding строит дерево частоты вхождения символов и дальше кодирует самые популярные меньшим числом бит. Очевидно что перестановка не будет иметь никакого эффекта на Huffman coding.

Значит необходимо оптимизировать для LZ77. В первую очередь необходимо поставить алфавит или в самый конец файла или в самое начало, это даст больше возможностей для обратных ссылок.

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

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

Ну и переписать исходники так, чтоб было максимально много повторяющихся блоков текста :)

Вот онлайн демка lz77:
http://www.geocities.ws/diogok_br/lz77/demo.htm

@ai
Copy link
Owner

@ai ai commented Oct 10, 2018

Есть ещё варианты — генетический алгоритм 😄

@ai
Copy link
Owner

@ai ai commented Oct 12, 2018

Я написал новый брутфорсер, который быстрее 21b99f7

@subzey
Copy link
Contributor

@subzey subzey commented Oct 13, 2018

FYI: в гзипе бэкреференс не может быть короче 3 байт (нет даже способа закодировать длину 2)
В строке abcxabc будет использоваться бэкреф, а в abxab — нет.

Возможно, есть смысл извлечь из окружения триграммы (только "полезные":

hello world -> hel ell llo wor orl rld

и уже плясать от них: склеивать и комбинировать в разном порядке

@ai
Copy link
Owner

@ai ai commented Oct 13, 2018

@subzey ага, по твоему совету сильно ускорил перебор 49bb25a

@everdimension
Copy link

@everdimension everdimension commented Oct 24, 2018

Изначальная задача напомнила мне вот эту статью-визуализацию факториала пятидесяти двух https://czep.net/weblog/52cards.html

Интересное чтиво, рекомендую :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

5 participants