|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
В то-же время для md5_mixalpha-numeric-space#1-8_0 радужная табличка занимает 51.64Gb. Хм... при таком пространстве ключей места для них - не хватит физически. Что-же они делают с ключами? Тоже подвергают редукции? 1-8 это я так понимаю все ключи диапазона до 8 символов. Даже больше. Тк. надо учесть еще и все 7 символьные и 6 символьные и так далее. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 11:14 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Пока надо отъехать назад. Короткий брейншторм. Alpha-num - множество символов латиницы + цифры. 26 + 26 + 10 = 62 Пишу на псевдо-языке. Код: sql 1. 2. 3.
Я получил файл ключей ранжированных по хешу. И возможность вести поиск любого ключа или доказать что в базе нет ключа соотвевтвующего данному хешу. Длина файла: Код: sql 1.
52 Гигабайта сортированных по хешу ключей. Грубо говоря за 36 итераций дихотомического поиска я в этом файле нахожу любой ключ либо доказываю что его нет. Неправильно посчитал. 62^6 это количество ключей, а одна запись в файле {ключ, хэш} это минимум 43 байта, т.е. умножай на 43 и будет ~2 Тб. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 12:17 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T, спасибо. Вот как полезен взгляд со стороны. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 12:19 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton А таблицы эти уже построены. Проект называется http://project-rainbowcrack.com/ Поэтому к той теме я ничего нового не добавлю. Просто сижу. Разбираюсь. Заглянул туда, там самая большая таблица на 1.3*10 16 ключей, а ты замахнулся на 3.2*10 21 (это 62 12 ), оно больше в 246000 раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 12:27 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Насколько я понимаю… механика memory trade-off это есть некий ползунок который позволяет нам самим решать сколько выделить под хранение и сколько под поиски нашего ключа. Статья Ошлина декларирует параметры int t = 7; // Chain length int m = 16; // Chains in table Это две оси измерений. И есть еще длина ключа. Или сет длин ключей если я хочу вариативный режим. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 12:37 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Насколько я понимаю… механика memory trade-off это есть некий ползунок который позволяет нам самим решать сколько выделить под хранение и сколько под поиски нашего ключа. Да, как я понимаю. Например у тебя полная таблица 2 Тб, ты хочешь ужать до 2 Гб, т.е. в 1024 раза, просто делаешь размер цепочки 1024 и генеришь под нее таблицу, размер записи не меняется, сама запись состоит из {ключ первого в цепочке, хэш последнего}. mayton И есть еще длина ключа. Или сет длин ключей если я хочу вариативный режим. Удобнее несколько таблиц взять, чем сделать одну для ключей переменной длины. Ключ переменной длины займет дополнительное место, запись переменной длины создаст проблемы при поиске. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 13:01 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Кроме статей Филиппа Ошлина - практически ничего нет. Видео-материалы по теме на 99% состоят либо из практического руководства по установке или использованию rt-gen, либо из докладов Индусов которые рисуют корявые картинки на тему самих основ. Я так понимаю тема не сильно популярная, поэтому берут готовый софт и таблицы качают. Я немного поразмышлял над генератором таблиц - задача непростая. Непонятно как запараллелить. Например имеем последовательность делим ее на цепочки по 3 Код: sql 1.
Если тупо считать от каждого ключа, то таблица не уменьшится, т.к. получим избыточные цепочки от каждого ключа Код: sql 1. 2. 3.
Т.е. дополнительно надо как-то проверять что промежуточные ключи (или их хэши) не присутствуют в цепочке. Допустим один поток считает от k1 Код: sql 1.
В это время другому потоку выдали k15, но т.к. первый не досчитал, то в таблице этого ключа нет. Если создать централизованное хранилище обработанных ключей, то будут тормоза из-за доступа к нему. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 13:24 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T mayton И есть еще длина ключа. Или сет длин ключей если я хочу вариативный режим. Удобнее несколько таблиц взять, чем сделать одну для ключей переменной длины. Ключ переменной длины займет дополнительное место, запись переменной длины создаст проблемы при поиске. Да. Они предполагают что у нас нет вариативной длины ключа. Просто тупо разделяют таблицы по длинам. Для каждой длины - своя таблица. Это удобно для навигации по бинарному файлу. Записи - фиксированной длины. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 14:26 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T В это время другому потоку выдали k15, но т.к. первый не досчитал, то в таблице этого ключа нет. Если создать централизованное хранилище обработанных ключей, то будут тормоза из-за доступа к нему. Да я тоже об этом думал. Если у нас - возможны коллизии ключей в процессе построения цепочки то надо как-то их детектировать. Хеш-мапа? Дерево? А как с параллелизмом? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 16:58 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Dima T В это время другому потоку выдали k15, но т.к. первый не досчитал, то в таблице этого ключа нет. Если создать централизованное хранилище обработанных ключей, то будут тормоза из-за доступа к нему. Да я тоже об этом думал. Если у нас - возможны коллизии ключей в процессе построения цепочки то надо как-то их детектировать. Хеш-мапа? Дерево? А как с параллелизмом? Как вариант: битмап для первого миллиарда ключей, займет памяти всего 128 Мб, а дальше каждый поток стартует с очередного ключа (1,2,3 и т.д.) и пилит свою последовательность разрубая ее на цепочки нужной длины, как наткнулся на ключ меньше лярда - проверка по битмапу - не посчитано ли дальше другим потоком, т.е. синхронная проверка очень малого количества ключей. Но тут еще надо добавить контроль зацикливания и перетекания в другую цепочку, а может и не надо, хз сколько это добавит лишнего. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 20:37 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Самый лучший параллелизм - это shared nothing. Если запускать процессы формирования таблиц для 12,11,10 ... e,t.c символьных ключей раздельно то у них не будет коллизий вообще. Правда мне кажется диск может стать узким местом. Тут нужна какая-то механика буферизации I/O и сортировка дисковых записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 22:59 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Вот специально для такого любопытного как я, сделали формулы https://www.tobtu.com/rtformulas.php ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 23:19 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Самый лучший параллелизм - это shared nothing. Если запускать процессы формирования таблиц для 12,11,10 ... e,t.c символьных ключей раздельно то у них не будет коллизий вообще. Нет гарантии что цепочки не сольются и разные потоки начнут считать одно и то же. Например Код: sql 1. 2.
mayton Правда мне кажется диск может стать узким местом. Тут нужна какая-то механика буферизации I/O и сортировка дисковых записей. I/O тут очень мало, в основном расчеты. Цепочка из миллионов пар записывается в 40 байт, а считается она от секунды до нескольких минут. С сортировкой проблему можно порешать хранением в несколько файлов: накопил в map миллион записей - сбросил в файл в сортированном виде и т.д. в конце смержил все файлы в один. Или организовать файл постранично в виде дерева, как SQL-сервера хранят кластерный индекс. Я придумал алгоритм распараллеливания: Делаем битмап на первый миллиард ключей, очередь заданий на продолжение, очередь результатов. Создаем пул потоков считателей, каждый поток получает задание (ключ - начало цепочки), обсчитывает цепочку, помещает в очередь результатов. При получении ключей присутствующих в битмапе - пометка в битмапе как обработанных. Если ключ в битмапе уже помечен обработаным, то остановка расчета цепочки, возврат посчитанного. Из посчитанной цепочки проверяется хэш последнего на присутствие в базе, если отсутствует, то формируется задание от ключа (редукции хэша), т.е. расчет цепочки следующей за этой. Результат в любом случае записывается в таблицу. Получение задания на расчет: извлекаем из очереди заданий, если там пусто, то из битмапа очередной не обсчитанный. Если в битмапе все помечены, то завершение. Таким образом будут обсчитаны все последовательности для ключей до миллиарда и перекрытие цепочек будет незначительное. Но непонятным остается вопрос: сколько дыр осталось? Т.е. сколько ключей не попало ни в одну из цепочек. Приблизительно покрытие можно прикинуть посчитав общее количество ключей в обсчитанных цепочках. Узкое место это проверка хэша из результата в таблице из ранее посчитанного. Это займет большее время чем сам расчет цепочки. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 08:08 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T mayton Самый лучший параллелизм - это shared nothing. Если запускать процессы формирования таблиц для 12,11,10 ... e,t.c символьных ключей раздельно то у них не будет коллизий вообще. Нет гарантии что цепочки не сольются и разные потоки начнут считать одно и то же. Например Код: sql 1. 2.
А как ты себе понял выбор вот этого параметра? Он также есть в статье. Код: sql 1.
Для меня пока он - вообще не очевиден. Я его взял с потолка. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 12:52 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T I/O тут очень мало, в основном расчеты. Цепочка из миллионов пар записывается в 40 байт, а считается она от секунды до нескольких минут. С сортировкой проблему можно порешать хранением в несколько файлов: накопил в map миллион записей - сбросил в файл в сортированном виде и т.д. в конце смержил все файлы в один. Или организовать файл постранично в виде дерева, как SQL-сервера хранят кластерный индекс. Самое лучшее распараллеливание - это на уровне входных данных. Например. Если ключи у нас - даты c префиксом вида от Berlin-1939-01-01 до Berlin-2020-01-01 то мы их можем разделить по модулю 4 к примеру и раздать в виде задания на 4 worker-threads. Но в процессе генерации хешей и свёрток мы должны контролировать появление уже расчитанной свёртки иначе мы зацикливается на расчете того что уже было расчитанно. Но если коллизия и проверка по хешу (который будет разделяемым объектом между 4 потоками) слишком дорого стоит то мы можем на нее забить болт и спокойно досчитать цепочку до величины t. Это даст возможность worker-thread работать на его крейсерной скорости. А уже после окончательного формирования таблицы для всего диапазона Berlin-* можно прогнать либо sort либо unique просто одним потоком по большому файлу. Кстати у меня - дежавю. Мне кажется где-то мы обсуждали unique несколько лет назад и даже писали код. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 13:02 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton А как ты себе понял выбор вот этого параметра? Он также есть в статье. Код: sql 1.
Для меня пока он - вообще не очевиден. Я его взял с потолка. Это длина одной цепочки. За счет нее получается сжатие, т.е. экономия памяти, но увеличение времени расчета. Читай алгоритм 22046586 , я там это число назвал N. Выбор конкретного значения зависит от размера ключа и желаемого размера таблицы. Пример расчета я тоже давал Dima T Размер одной записи таблицы 9 (ключ) + 32 (хэш) = 43 байта Допустим таблица 4.3 Тб (4.3*10 12 ), т.е. 10 11 записей Всего у тебя 4.7*10 21 (64 12 ) вариантов ключа, следовательно в одной записи цепочка из 4.7*10 10 пар {ключ, хэш} Т.е. для того случая t = 4.7*10 10 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 13:06 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T mayton А как ты себе понял выбор вот этого параметра? Он также есть в статье. Код: sql 1.
Для меня пока он - вообще не очевиден. Я его взял с потолка. Это длина одной цепочки. За счет нее получается сжатие, т.е. экономия памяти, но увеличение времени расчета. Читай алгоритм 22046586 , я там это число назвал N. Выбор конкретного значения зависит от размера ключа и желаемого размера таблицы. Пример расчета я тоже давал Все равно не понимаю. Для моего случая. Я начинаю симуляцию в 1 поток. 17-символьные ключи. Алфавит малый. Хеш-короткий. t=5 Код: sql 1. 2. 3.
Где здесь экономия? Я мог просто сохранить первые 2 столбца таблицы. Код: sql 1. 2.
Да могли произойти совпадения на Berlin-1939-01-02 который случайно возник после редукции. Но разве это будет системным? Настолько системным чтобы выборосить целую цепочку второй строки? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 13:21 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Кстати у меня - дежавю. Мне кажется где-то мы обсуждали unique несколько лет назад и даже писали код. Писали, но задача была другая: выбрать уникальные строки из большого текстового файла. mayton Все равно не понимаю. Для моего случая. Я начинаю симуляцию в 1 поток. 17-символьные ключи. Алфавит малый. Хеш-короткий. t=5 Код: sql 1. 2. 3.
Где здесь экономия? Я мог просто сохранить первые 2 столбца таблицы. Некорректный пример, функция редукции на конкретное значение хэша дает всегда одно и тоже значение нового ключа. Похоже правда не понимаешь в чем суть. Давай на примере: есть последовательность Код: sql 1.
т.е. взяли первый ключ, самый маленький, Berlin-1939-01-01. Посчитали его хэш (h1), затем посчитали редукцию h1 и получили какой-то ключ, например k147. Мы заранее не знаем какой ключ получим, узнаем только посчитав, но знаем что результат неизменен, т.е. редукция h1 всегда выдает k147. Затем считаем хэш k147 (h147) и т.д. у нас выстраивается цепочка нужной длины. Пусть t=4, приведенная цепочка записывается в таблицу как {k1, h92}, ключ первого и хэш последнего, остальные три пары никуда не пишем потому что взяв k1 восстановим всю цепочку, отсюда сжатие в 4 раза. mayton Самое лучшее распараллеливание - это на уровне входных данных. Например. Если ключи у нас - даты c префиксом вида от Berlin-1939-01-01 до Berlin-2020-01-01 то мы их можем разделить по модулю 4 к примеру и раздать в виде задания на 4 worker-threads. Не получится. Т.к. заранее невозможно предсказать какая последовательность ключей будет. Она может зациклиться, сгенерится ключ обработанный ранее. Два разных потока могут сгенерить одинаковый ключ и начнут считать одно и то же. Хранить обработанные ключи мы не можем даже биткартой из-за их огромного количества. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 14:27 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T Давай на примере: есть последовательность Код: sql 1.
А почему ты остановил цепочку на хеше? Нужен-же ключ. Хеш - толстый. 160 бит. 256 бит. Вся суть в том что хеши мы не храним. Я как себе понимаю. Мы должны начать с чего угодно. Но в конце цепочки должен стоять известный ключ. Тогда для Код: sql 1.
Выкидываем хеши. Остается k1 и k92. И мы заранее знаем длину цепочки (по определению) 8 элементов. Или точно вычислим что в ней было не более чем 3 хеш преобразования. Код: sql 1.
И тогде для данного искомого хеша h1, мы делаем как в рекурсии Reduct(h1) и ищем среди всех правых ячеек. Потом еще раз Reduct(Hash(Reduct(h1))) и еще раз ищем. И потом еще раз Reduct(Hash(Reduct(Hash(Reduct(h1)))) и если не нашли то уже 100% нету такого у нас в базе. Верно? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 18:30 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Верно? Поздравляю, ты усовершенствовал исходный алгоритм )) Храня цепочку как {ключ первый, ключ последний} при 12 символах ключа мы займем 18 байт против 43-х, т.е. запись будет в 2.4 раза компактней. Но т.к. разные хэши после редукции могут дать один и тот же ключ, то возможно несколько разных цепочек с одинаковым окончанием. Хотя и это не проблема для построения таблицы, но для поиска нужного ключа возможно придется пройти не одну, а несколько цепочек с одинаковым окончанием. Автор алгоритма скорее всего не стал заморачиваться на возможно повторяющиеся конечные ключи, а просто взял уникальный хэш как ключ для поиска (коллизия терминологий), который не должен повторяться к таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 19:27 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Dima T mayton Верно? Поздравляю, ты усовершенствовал исходный алгоритм )) Храня цепочку как {ключ первый, ключ последний} при 12 символах ключа мы займем 18 байт против 43-х, т.е. запись будет в 2.4 раза компактней. Но т.к. разные хэши после редукции могут дать один и тот же ключ, то возможно несколько разных цепочек с одинаковым окончанием. Хотя и это не проблема для построения таблицы, но для поиска нужного ключа возможно придется пройти не одну, а несколько цепочек с одинаковым окончанием. Автор алгоритма скорее всего не стал заморачиваться на возможно повторяющиеся конечные ключи, а просто взял уникальный хэш как ключ для поиска (коллизия терминологий), который не должен повторяться к таблице. Я сильно сомневаюсь что я смог что-то улучшить в проекте http://project-rainbowcrack.com/ Я занимаюсь им только 5 дней. А ребята - много лет. Я просто хочу идеи сжатия толстых поисковых таблиц применить на практике но в другой области. Блокчейн. Базы данных. Биг-дата. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 19:35 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Я сильно сомневаюсь что я смог что-то улучшить в проекте http://project-rainbowcrack.com/ Я занимаюсь им только 5 дней. А ребята - много лет. Ты улучшил мой перевод их алгоритма 22046586 , возможно я невнимательно вникал, может мой английский подвел. mayton Я просто хочу идеи сжатия толстых поисковых таблиц применить на практике но в другой области. Блокчейн. Базы данных. Биг-дата. Сомневаюсь что получится. Там ключ большой, как следствие гигантское количество вариантов ключа такого размера. 12 символов это всего ничего, но уже дофига для данного алгоритма 22047496 PS Я вижу только одно применение данному алгоритму, но тут это запрещено обсуждать. И примеры на радужном сайте как раз про это. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:08 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
Приведу цитату с Биткоин вики https://ru.bitcoinwiki.org/wiki/Майнинг Работа майнеров заключается в подборе правильного хэша, который подойдет ко всем транзакциям, находящимся в сети, и обеспечит получение секретного ключа. Возможных комбинаций – миллионы, поэтому процесс, как правило, занимает много времени и требует наличия мощного оборудования. Hash Rate — скорость, с которой решается математическая задача. Измеряется параметром «хэш в секунду» (H/s). Искомый майнерами хэш представляет собой величину, состоящую из хэша предыдущего блока, случайного числа и суммы контрольных чисел транзакций, прошедших за последние 10 минут. Условия системы может удовлетворить одна единственная величина, которая также не является постоянной и изменяется после закрытия каждого блока. Как только правильный хэш определен, блок транзакций закрывается и майнер получает вознаграждение в размере 12.5 биткоинов. Этот процесс можно сравнить с лотереей, так как одновременно поисками хэша занимаются множество участников. Система действует в соответствии со строгими правилами, согласно которым изменение закрытого блока практически невозможно. Разные криптовалюты используют разные алгоритмы POW или той самой безсмысленной работы. SHA1 кажется релевантна к биткоину. Эфириум например здесь не подходит. У него какая-то другая функция POW. Моя идея была еще в том чтобы разбалансировать майнинг с GPU/ASIC на рабочие станции с дисковой стойкой. Но это - мечты и идеи которые надо просто проверять. Пока - вопрос о принципиальной возможности. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:32 |
|
Тяпничный криптунЪ и редукция
|
|||
---|---|---|---|
#18+
mayton Пока - вопрос о принципиальной возможности. Для данного алгоритма невозможно, т.к. ключ состоит из "хэша предыдущего блока, случайного числа и суммы контрольных чисел транзакций, прошедших за последние 10 минут", т.е. значительно больше неподъемных 12 символов. И еще невозможно по объективной причине: меняется только случайное число, а чтобы иметь возможность получить любой желаемый хэш случайное число должно иметь разрядность как у хэша, но оно всего лишь 32 бита . PS Получается что у майнеров всего 2 32 вариантов хэшей и не факт что есть хоть один, который даст требуемое количество ноликов на конце, т.е. есть комбинации которые заведомо невозможно намайнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 20:49 |
|
|
start [/forum/topic.php?fid=16&msg=39907855&tid=1339856]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
145ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 269ms |
0 / 0 |