Няшная / Говнокод #27660 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
for (size_t i = 0; i < 4; ++i) {
    __m128 x0 = _mm_loadu_ps((const float*)blocks[0] + i * 4);
    __m128 x1 = _mm_loadu_ps((const float*)blocks[1] + i * 4);
    __m128 x2 = _mm_loadu_ps((const float*)blocks[2] + i * 4);
    __m128 x3 = _mm_loadu_ps((const float*)blocks[3] + i * 4);
 
    __m128 t0 = _mm_unpacklo_ps(x0, x1);
    __m128 t1 = _mm_unpackhi_ps(x0, x1);
    __m128 t2 = _mm_unpacklo_ps(x2, x3);
    __m128 t3 = _mm_unpackhi_ps(x2, x3);
 
    x[i * 4 + 0] = _mm_castps_si128(_mm_movelh_ps(t0, t2));
    x[i * 4 + 1] = _mm_castps_si128(_mm_movehl_ps(t2, t0));
    x[i * 4 + 2] = _mm_castps_si128(_mm_movelh_ps(t1, t3));
    x[i * 4 + 3] = _mm_castps_si128(_mm_movehl_ps(t3, t1));
}

4х MD5

https://ideone.com/a8YcZ8

Запостил: bormand bormand, (Updated )

Комментарии (171) RSS

    • (чистый хешрейт по показаниям профайлера, табличку с искомыми хешами пока не прикрутила)
      Ответить
  • Круто, работает. Но итоговая скорость в моей программе 2 Mh/s против 4 Mh/s, которые дала интеловская библиотека.

    Похоже, что там и перебор придётся делать на SIMD, чтобы соответствовать.
    Ответить
    • Хм, интересно что там интел навернул... AVX что ли?
      Ответить
        • Тогда понятно почему 2 против 4, у них тупо регистры вдвое длиннее ;(
          Ответить
          • Я пока не могу придумать, как применить SIMD к бруту.

            По идее можно стартовать так:
            aaaaaa@gmail.com
            baaaaa@gmail.com
            caaaaa@gmail.com
            daaaaa@gmail.com

            Следующим шагом будет:
            aaaaab@gmail.com
            baaaab@gmail.com
            caaaab@gmail.com
            daaaab@gmail.com

            Но мы не можем запихать четыре емейла в один регистр. Нужно транспонировать матрицу.

            Возьмём другую идею. Стартуем так:
            aaaaaa@gmail.com
            baaaaa@gmail.com
            caaaaa@gmail.com
            daaaaa@gmail.com

            Следующим шагом будет так:
            bbbbbb@gmail.com
            cbbbbb@gmail.com
            dbbbbb@gmail.com
            ebbbbb@gmail.com

            Потом стартовый шаблон меняют.

            Всё равно ничего в голову не идёт...
            Ответить
            • > транспонировать матрицу

              Код, который я запостила в этом треде именно это и делает )))

              Всего 8 команд у тебя на транспонирование 4х4 уйдёт. Ну плюс выгрузки-загрузки если нужны.
              Ответить
              • Давно я не брался за SIMD. Последний раз это было, когда мы на «Говнокоде» разрабатывали ненормальную сортировку.
                Ответить
            • З.Ы. А вообще -- почини профайлер, вдруг с брутом рано ещё пердолиться. У меня всего в районе 5% на него уходит (банальное вписывание символов по модулю от 64-битного числа). Основная нагрузка на хеширование и проверку.
              Ответить
              • К слову, рекорды того, что у меня получилось:
                g++ -O3: 4 Mh/s;
                clang++ -O3: 3,5 MH/s;
                cl /O2: 3 MH/s.

                Интеловская библиотека по идее не должна давать разные результаты, там большая часть на ассемблере. Значит, оптимизация поиска по мапе разная.

                С какими ключами можно выжать самый быстрый код в gcc, в clang и в msvc? PGO чем-нибудь поможет?
                Ответить
                      • Дожал до 5 MH/s.

                        Две идеи:
                        1. Сократил количество вызовов итератора по именам. Заранее нагенерировал несколько префиксов, а потом к каждому префиксу добавлял суффикс, возвращённый итератором (не через strcat, а тупо через memmove, потому что размеры мне известны).

                        2. Использовал PGO.

                        Всё-таки, можно что-то выжать, меняя алгоритмы подбора.
                        Ответить
                        • > через memmove

                          Да можно прям в буфере инкремент делать, чтобы совсем zero copy.

                          Тебе всё равно надо учиться делить пространство на регионы чтобы треды поддержать. Вот выдай каждому буферу свой регион с конкретным префиксом, суффиксом и диапазоном символов и пусть себе инкрементит.

                          Заодно suspend/resume можно организовать чтобы не начинать каждый раз с нуля.
                          Ответить
                          • С инкрементом не всё просто. Нужно инкрементить не только последний символ, а ещё обрабатывать «перенос в следующий разряд», т. е. рекурсивную проверку на то, что дошли до последнего символа алфавита, с инкрементом «следующего разряда», если вдруг дошли.

                            Когда дошли до azzzzzz@mail.ru, нужно обновить строку до baaaaaa@mail.ru, т. е. выполнить инкремент одного разряда и сброс шести.

                            Если мы параллельно считаем суммы для строк с разными префиксами или с разными суффиксами, то мы одновременно будем выполнять одну и ту же рекурсивную проверку с инкрементами. А можно её сделать один раз на все префиксы/суффиксы и расклонировать результат. Так выходит быстрее.
                            Ответить
                            • А, я поняла. Ты инкрементишь один кусок и тестишь его с пачкой разных префиксов и суффиксов.

                              Да, тоже норм подход.

                              Хотя инкрементится обычно один символ. Переносы амортизируются, в среднем это О(1).
                              Ответить
                              • Вообще какой самый быстрый способ перебора?

                                Преобразованием системы счисления числового счётчика будет медленно, потому что там нужно выполнять дофига делений с остатком.

                                1024-- и я додумались только до рекурсивной проверки условия, когда разряд дошёл до последнего символа алфавита. При таком алгоритме проверять все разряды придётся редко.

                                Только что подумал ещё об одной идее: предварительно сгенерировать массив часто перебираемых подстрок. Например, трёхсимвольных комбинаций букв латинского алфавита всего 17576, трёхсимвольных комбинаций букв латинского алфавита и цифр всего 46656. Их можно закэшировать, тогда проверок будет меньше. Хотя, пожалуй, лучше взять четыре. Тогда каждая кобенация займёт 32-битный регистр.
                                Ответить
                                • Я думаю стоит просто написать все и побенчить какой быстрее...

                                  Ставлю на инкремент при помощи таблички nextChar (и если старший бит стоит -- значит надо следующий тоже). Перенос амортизируется его редкостью, переход всего один.
                                  Ответить
                                • На ум приходит "код Грея", но неясно, как его можно применить.
                                  Ответить
                            • Есть ещё интересный вариант с avx broadcast. Можно за две команды впердолить переменную часть во все 8 блоков. Заодно можно будет выкинуть транспонирование матрицы т.к. мы работаем с уже транспонированными блоками.

                              Но это уже только с самодельной реализацией md5 возможно.
                              Ответить
                                • Ну да, они и сейчас там считаются.

                                  Просто входные данные приходится немного препроцессить, чтобы слова упаковать по 8 в регистр (то самое транспонирование).

                                  Если данные будут сразу лежать как надо, можно неплохо сэкономить.

                                  Выходное транспонирование тоже по идее можно выкинуть, просто хеши будет чуть сложнее сравнивать и memcmp уже не прокатит.
                                  Ответить
                                • Как сейчас:

                                  uint8_t data[8][64]

                                  Первый индекс номер блока, второй позиция в блоке.

                                  Как оптимально для avx:

                                  uint32_t data[16][8]

                                  Первый индекс позиция в блоке, второй номер блока.
                                  Ответить
                    • А у нас в джаве PGO из коробки. Джит называется
                      Ответить
                      • > Джит

                        Приходишь с утра на работу, открываешь IDE на джаве. К вечеру оно наконец-то прогревается. Ты говоришь "just in time!" и идёшь домой.
                        Ответить
                  • Прочитал про LTO. Имеет смысл, если линкуется много объектных файлов.

                    Интересная вещь. Компилятор передаёт линкеру метаданные. По сути похоже на то, как выглядит линковка в языках, в которых модульная система была изначально.

                    Жалко, что на уровне языка модулей нет, а только архаичный препроцессор...
                    Ответить
            • прямой перебор это худший вариант. сделай частотный словарь буков и уже ответвляйся от дерева а не последовательности
              Ответить
        • > AVX

          Блин, почти портировала на AVX, но что-то запуталась в транс-понировании матрицы 8х8... Кручу-верчу запутать хочу.

          А подсматривать у интела как-то неспортивно.
          Ответить
    • https://ideone.com/qrTdI1

      Интересно, а AVX сборка у тебя сравнима с интелом будет? Или их код лучше?

      З.Ы. ideone чот криво настроено, avx не умеет.
      Ответить
  • Добавила хешмапу с 65536 хешами.

    std::unordered_set:
    15 MH/s (37% на вычисление хеша, 60% на проверку по хешмапе)

    std::unordered_set + 20-битная битмапа:
    25 MH/s (74% на вычисление хеша, 20% на проверку по хешмапе)
    Ответить
    • Лол, вспомнила, что на метод, который роется в мапе, я добавляла noinline чтобы профайлер лучше его видел. Убрала. Пирфоманс поднялся до 33 MH/s.
      Ответить
  • Фильтр Блума что-то не приносит профита по сравнению с обычной битмапой. При маленьком размере он тупо переполняется единичками, при большом размере он работает медленнее.

    Может быть у меня лапки?
    Ответить
    • А как он у тебя используется?

      По идее надо подобрать параметры так, чтобы для 68000 вставленных элементов (эталонные хэши) вореатность ложного срабатывания была где-то в районе 1e-6, плюс-минус пара порядков — чтобы на один мегахэш были единицы (помимо реальных совпадений) «выпаданий» из горячего цикла.
      Ответить
      • Да тупо защищает мапу от обращений...

        Видимо сама мапа не такая уж тяжёлая, чтобы её защищать ценой лишних кешмиссов.

        А фильтр довольно жирный даже для 5% (19 бит).
        Ответить
      • У меня: на миллион посчитанных хэшей 10 найденных ящиков и 10 тысяч ложных срабатываний фильтра Блума. Т. е. выпадения из горячего цикла составляют целый 1%. Многовато...

        В фильтре Блума 6 хэш-функций, размер фильтра — 2 в 19 степени.

        Куда крутить?
        Ответить
        • Увеличил фильтр до 20 бит. Получил 200 промахов на миллион, т. е. 2e-4. Скорость не прибавилась.

          С фильтром на 21 бит получил 3 промаха на миллион, а скорость стала только меньше.
          Ответить
          • Ну вот когда я взял фильтр из pow(2, 21) = 2097152 битов, я получил вероятность промаха 3e-6 на 6 функциях. Если увеличу их количество до 20, то, возможно, как раз 1e-6 и будет. Только скорость будет адово низкой.

            В такой задаче фильтр Блума мешает, потому что тратится время на его расчёт.
            Ответить
          • Наговнокодил 20 хэш-функций. Пашет вообще без промахов. Похоже, что фильтр Блума выполняет функцию мапы. Скорость упала на 1/8.
            Ответить
            • А если пойти в другую сторону и затаргетиться на 1e-3? 10 хэшей, 2^20 батов фильтра.
              Ответить
            • Попробуй переписать на JAWA. Скорость повысится в 0.05 раз.
              Ответить
              • Но это только на первые несколько секунд работы, потом включится СБОРЩИК МУСОРА и обоссыт весь перфоманс своими лагами. Потому что JAWA – это то, про что говорят «какой анскилл )))».
                Ответить
                • Ещё нужно не забыть опцию -Xmx, иначе соснешь OOM. Ну и памяти докупить, конечно.
                  Ответить
                  • А ещё крайне важно установить:

                    – Jawa8, чтобы играть в Майнкрафт.

                    – Jawa16, чтобы играть в Майнкрафт, написанный на новых версиях Jawa (если играть на старых версиях Jawa, то можно соснуть СТРАШНЫЙ EXCEPTION).

                    – jawa6, если ты работаешь в БАНКЕ.

                    Т.е. софт, написанный на Jawa8, может не запуститься на Jawa16 и наоборот, какой пиздец! В итоге все россказни про единую виртуальную машину и экосистему оказались ЛОЖЬЮ, ведь нужно иметь ДЕСЯТКИ виртуальных машин... Это всё продиктовано жаждой наживы корпорастов из Jawa-корпорации: засрать всю свободную оперативную и энергонезависимую память виртуальными машинами, чтобы пользователь не установил другие программы.
                    Ответить
                • > СБОРЩИК МУСОРА

                  Какой анскилл )))

                  У меня вот в коде ни одной лаллокации после того как инициализация пройдена.
                  Ответить
                  • Перепиши на JAWA - появится. Будешь int в куче выделять.

                    + Integer i = new Integer(42);

                    - int i = 42;
                    Ответить
    • У меня тоже лапки. Библиотека robin_hood идеальна. Самодельный фильтр Блума её только портит.
      Ответить
      • > идеальна

        Я хочу еще с префетчем поиграться, как пи предлагал.

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

        З.Ы. Или вообще переплести проверку и рассчёт, не разбивая их на фазы. Во время расчета не нужна память, во время проверки не нужен проц. Вроде должно хорошо сочетаться.
        Ответить
        • С другой стороны, гипертрединг поди как раз эти остатки отдал второму треду и сильно лучше уже не выйдет...
          Ответить
              • Я просто не очень понимаю как это можно тюнить "вслепую", если конечно у тебя не 286-й.

                У тебя для твоих процов нет эмулятора или профайлера умного чотбы показать кешмисы, занятость префетчера, ождание памяти итд
                Ответить
                • У контроллеров обычно ничего этого и нет. Разве что пайплайн на пару стадий и небольшой буфер для кеша команд.
                  Ответить
                  • Ну то есть под них можно оптимизироваться почитывая доку.

                    Так у тебя есть Витюня, или ты просто знаешь, как это работает?
                    Ответить
                    • Под тот же avr вообще все тайминги в даташите расписаны.

                      arm'ы (Cortex M) безусловно сложнее, но тоже без фанатизма.
                      Ответить
                • Для ранних штеудов были на каждый опкод таблицы таймингов, вполне можно было тюнить без профайлера.
                  Ответить
                  • Какой Фог ))

                    У современного камня всё так насрано внутри, что я вообще уже слабо понимаю что там происходит
                    Ответить
            • Лень... его же в репе нету скорее всего, придётся с сайта качать. А там поди регаться.
              Ответить
                • Спасибо, так и поступлю.

                  У меня в общем-то была учётка, я там какие-то курсы про fpga слушала. Но они посчитали, что я давно не захожу и ёбнули её.
                  Ответить
                  • Кое-что из-под этой учётки уже скачал.

                    У них на сайте много чего изменилось. Оригинальный «icl» и компилятор «Фортрана» они куда-то убрали, а вместо «icl» теперь предлагают скачать модифицированный «Шланг», правда, с интеловскими библиотеками.
                    Ответить
                    • Объясните а зачем качать «VTune»?

                      Что он даёт, чего нет в perf?
                      Ответить
                      • Думаю это как сравнить Instruments и голый DTrace.
                        Хотя борманд может наверное и с perf справиться.

                        vtune еще небось умеет читать всякую проприетарную питушню, про которую интел никому не рассказывает
                        Ответить
                        • > perf

                          Блядь, вот я дура... Кто ж прогресс замеряет одним атомарным счётчиком на все 12 тредов.

                          Заменила на 12 отдельных счётчиков, разнесённых на кешлайн. Сразу 250 Mh/s -> 440 MH/s (64% от теоретических 12 х 57 MH/s)
                          Ответить
                        • В среднем 1 кешмисс в L2 на каждый хеш. Блядь, откуда, вроде всё в метр должно поместиться...

                          Надо std::map std::set всё-таки выкорчевать и заменить на что-то приличное.
                          Ответить
                        • Это же джва разных сорта профулеров.
                          А если у штеуда в процах был дебажный бэкдор, то давно уже была атака типа Spectre.
                          Ответить
                    • Продолжение. Классический компилятор сишки и «Фортран» теперь, оказывается, в «HPC Toolkit».

                      Напридумывали трёхбуквенных названий, из которых ничего не понятно.
                      Ответить
  • Мы уже и забыли как борманд говнокодирует.
    Ответить
  • Ох блин, наконец-то подобрала нужную транс-позицию для AVX:
    for (size_t i = 0; i < 2; ++i) {
        __m256i x0 = _mm256_loadu_si256((const __m256i*)blocks[0] + i);
        __m256i x1 = _mm256_loadu_si256((const __m256i*)blocks[1] + i);
        __m256i x2 = _mm256_loadu_si256((const __m256i*)blocks[2] + i);
        __m256i x3 = _mm256_loadu_si256((const __m256i*)blocks[3] + i);
        __m256i x4 = _mm256_loadu_si256((const __m256i*)blocks[4] + i);
        __m256i x5 = _mm256_loadu_si256((const __m256i*)blocks[5] + i);
        __m256i x6 = _mm256_loadu_si256((const __m256i*)blocks[6] + i);
        __m256i x7 = _mm256_loadu_si256((const __m256i*)blocks[7] + i);
    
        __m256i t0 = _mm256_unpacklo_epi32(x0, x1);
        __m256i t1 = _mm256_unpackhi_epi32(x0, x1);
        __m256i t2 = _mm256_unpacklo_epi32(x2, x3);
        __m256i t3 = _mm256_unpackhi_epi32(x2, x3);
        __m256i t4 = _mm256_unpacklo_epi32(x4, x5);
        __m256i t5 = _mm256_unpackhi_epi32(x4, x5);
        __m256i t6 = _mm256_unpacklo_epi32(x6, x7);
        __m256i t7 = _mm256_unpackhi_epi32(x6, x7);
    
        __m256i s0 = _mm256_unpacklo_epi64(t0, t2);
        __m256i s1 = _mm256_unpackhi_epi64(t0, t2);
        __m256i s2 = _mm256_unpacklo_epi64(t1, t3);
        __m256i s3 = _mm256_unpackhi_epi64(t1, t3);
        __m256i s4 = _mm256_unpacklo_epi64(t4, t6);
        __m256i s5 = _mm256_unpackhi_epi64(t4, t6);
        __m256i s6 = _mm256_unpacklo_epi64(t5, t7);
        __m256i s7 = _mm256_unpackhi_epi64(t5, t7);
    
        x[i * 8 + 0] = _mm256_permute2x128_si256(s0, s4, 0x20);
        x[i * 8 + 1] = _mm256_permute2x128_si256(s1, s5, 0x20);
        x[i * 8 + 2] = _mm256_permute2x128_si256(s2, s6, 0x20);
        x[i * 8 + 3] = _mm256_permute2x128_si256(s3, s7, 0x20);
        x[i * 8 + 4] = _mm256_permute2x128_si256(s0, s4, 0x31);
        x[i * 8 + 5] = _mm256_permute2x128_si256(s1, s5, 0x31);
        x[i * 8 + 6] = _mm256_permute2x128_si256(s2, s6, 0x31);
        x[i * 8 + 7] = _mm256_permute2x128_si256(s3, s7, 0x31);
    }
    Теперь 54 Mh/s (62% вычисление хеша, 37% генератор и проверка по мапе). 8 хешей параллельно.
    Ответить
    • Если треды добавить, можно за 10 дней перебрать все 8-значные буквенно-цифровые сочетания...
      Ответить
      • Пиздец. И ты сможешь взломать любую учётку говнокода?
        Ответить
      • А хуй там, по памяти боттл-някнуло походу:

        12 тредов: 170 Mh/s
        6 тредов: 125 Mh/s
        4 треда: 105 Mh/s
        3 треда: 92 Mh/s
        2 треда: 77 Mh/s
        1 тред: 54 Mh/s
        Ответить
        • Блин, а нафиг я каждому треду свою мапу то сделала...

          С одной мапой и одним фильтром на всех 185 Mh/s
          Ответить
          • Упс, и профайлер надо отключать, оказывается... 250 Mh/s.
            Ответить
            • а что за профайлер, и как работает?
              переодически стопает треды и записывает их стек трейс?
              Ответить
              • > Переведи на «GPU»

                Отличное занятие для прохладного осеннего вечера...

                Правда мне куду лень вспоминать.
                Ответить
          • А как получается такой пирфоманс?
            Казалось бы, если у каждого треда своя питушня, то нет лишних взаимодействий и изолированный код проще писать и компилировать.
            Ответить
            • И как будет отличаться по пирфомансу вариант с просто отдельными процессами?
              Ответить
            • Одна мапа может в кеше сидит?
              Ответить
            • Я там сдуру сделала общий атомарный счётчик для прогресса, который и угашивал весь пирфоманс.

              С отдельным счётчиком на каждый тред параллелиться стало считай в 2 раза лучше.

              Ну и да, обращений в L3 было овердохуя из-за того, что я в очередной раз облажалась с размером кеша (6 х 256К а не 1.5М).

              Детские ошибки, в общем.
              Ответить
      • Я подумал о том, что сочетания длиннее восьми знаков без фермы для майнинга перебирать придётся долго, и вспомнил про вореции:
        https://github.com/1024--/voretions/blob/master/src/md/vorec-hist-2014-09-16.md

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

        Для начала попробовал тупо выбрать четырёхсимвольные слайсы изо всех юзернеймов «Говнокода». Их оказалось всего 45 тысяч (при полном переборе таких сочетаний было бы два с половиной миллиона).

        Тупо сконкатенировав два таких слайса, можно получить два миллиарда восьмисимвольных кобенаций. А если применить вореции (марковские цепи), то можно найти вменяемое количество более длинных кобенаций.
        Ответить
        • Попробовал вореции.

          Какая-то фантастика. Даже неоптимальный алгоритм с использованием std::string вместо сырых массивов даёт 12 Mh/s.

          Обучил на юзернеймах «Говнокода». При ограничении на длину вореции 11 символов нашёл 542 емейла за очень короткое время.

          Надо будет попробовать на чём-нибудь более сложном обучить.
          Ответить
            • Нашёл юзера DROP_TABLE_gosduma — у него емейл с девятизначной псевдорандомной частью до собаки, состоящей из букв и цифр.

              А у StertorPidor локальная часть вообще 11-значная. Тупым перебором 11-значные комбинации я бы за год не осилил.
              Ответить
            • Готов биться головой об заклад, что сентябрьский петух - не петух вовсе, а человек.
              Ответить
                • Печатать на клавиатуре могут:
                  - обезьяны, но вероятность ввода осмысленного текста практически равна нулю
                  - коты, но они обычно зажимают одну клавишу
                  - остаются люди или боты, но для бота икарус не похож - выглядит слишком умным
                  Ответить
                  • Хм, откуда инфа? Есть какие-то исследования?
                    Ответить
                      • Это про обезъян

                        А есть исследования, доказывающие что петух не в состоянии пользоваться клавиатурой?
                        Ответить
                        • На говнокоде можно провести исследования, показывающие что петух может пользоваться клавиатурой. Причём не один. Тут целый курятник развёлся.
                          Ответить
  • какое байтойобство ))

    а зачем тебе? ты спиздил базу хешей и брутишь?
    Ответить
    • Х.з., просто не могла пройти мимо специальной олимпиады...
      Ответить
      • В эпоху дискет, которые сыпались и размагничивались, многие мечтали о программе, которая бы брутила повреждённые байты архива под контрольную сумму.
        Ответить
        • P.S. Ну ещё на CD фольга часто до дыр протиралась. У DVD хоть защита от механических повреждений немного получше.
          Ответить
        • Рара с его избыточной инфой для восстановления ещё не было?
          Ответить
          • Я вспомнил прикол: скачал с одного сайта несколько программ в многотомных rar-архивах. Все тома, кроме первого оказались запоротыми.

            Оказывается, владелец сайта настроил сервер так, что файлы с расширением .rar, .zip и ещё некоторые отдаются как binary/octet-stream или как соответствующий мимими-тип архива, а все остальные отдаются как text/html или text/plain. Сервер тома с расширениями .r01, .r02, .r03 и т. д. посчитал текстовыми и зачем-то заменил в них байты с кодом 0 на байты с кодом 0x20=32 (код пробела). В итоге распаковать такие файлы можно, только набрутив, какие из пробелов нужно поменять на символы с кодом ноль.
            Ответить
            • тебе еще повезло, что там рашн апаче небыло
              Ответить
                • http://apache.lexa.ru/intro.html

                  Он на лету перекодировал файлы.

                  Самое печальное, что он был установлен на серверах шаред хостингов до середины нулевых (когда проблемы кодировок уже и не существовало) и портил файлы
                  Ответить
        • Тогда винты были маленькие и радушная таблица CRC32 не помещалась
          Ответить
  • 77 — хозяйка всем… Хюмала, рюмала, пюмала… Пришил… Остыл… Трах… Взрыв… Пан, пан, пан… Времена, события, люди… надо мной Кащей Бесфамильный… Локхид элевэйтор приобритейтид… А мама такая молоденькая, Володенька я… тибол и ниф… пух и прах…
    Ответить
        • Между прочим, ASD это autism spectrum disorder

          хотя тут вообще много аутистов
          Ответить
          • И это прекрасно же.

            ASD мне напоминает чувака, который делал TempleOS.
            Ответить
            • ASD_77
              bormand
              CHayT
              j123123
              JloJle4Ka
              gost/ISO/PolinaAksenova (хотя тут под вопросом)
              Ответить
              • > PolinaAksenova

                Вообще-то она няшка.

                > JloJle4ka

                Да и она тоже ничего.

                С остальным согласен, можно утверждать.
                Ответить
                • >> JloJle4ka

                  > Да и она тоже ничего.

                  Да, ставить Gentoo и перебирать всякие полурабочие браузеры для аутистов это вполне норм.
                  Ответить
                  • Вообще-то она это делает, чтобы улучшить безопасность и производительность системы, то есть у неё нет аутизма.
                    Ответить
                    • Да, всё правильно говоришь. У меня, в отличие от некоторых, нет аутизма. Я занимаюсь серьёзными вещами: свободой и безопасностью.
                      Ответить
                        • Как он поможет сделать мою систему свободнее или безопаснее?
                          Ответить
                          • Им можно находить кратчайший путь к безопасности в графе опасностей
                            Ответить
                            • Ладно, тогда ближе к выходным напишу. И запощщю на говнокод под СВОБОДНОЙ лицензией, чтобы вы тоже могли «найти кратчайший путь к безопасности в графе опасностей».
                              Ответить
                • > Национальная принадлежность

                  Хороший тест )))
                  Ответить
                  • Это чтоб набрать статистику, какая национальная принадлежность более склонна к аутизму.
                    Ответить
                    • Давай позовём ГОСТа и рус-не накрутим аутизма?
                      Ответить
                        • Ты же из Украины, разве ты не ненавидишь всех русских?
                          Ответить
                          • Русских в каком смысле? Проживающих на территории РФ? Имеющих какие-то гены, характерные только для русских? (если что, таких генов нет)

                            Что вообще значит "русскость"?
                            Ответить
                            • Исследования генов русских людей показали абсолютную генетическую идентичность русского населения на всем огромном пространстве России - между жителями Камчатки и Твери родства больше, чему немцев соседних земель. Но "русский ген" , оказывается, широко распространен и в Норвегии, Венгрии, Иране и даже во Франции.
                              Ответить
                              • Тут всё сложно.

                                С одной стороны, между поляками, словаками, белорусами, украинцами, русскими нет чёткой границы.

                                С другой стороны, на западе Украины и на севере России можно встретить гены, свойственные финно-уграм (через территорию Украины в своё время прошли венгры, некоторые остались). На юге Украины и России можно встретить гены, свойственные тюркам. В Польше можно встретить ассимилировавших пруссов.

                                Ещё с одной стороны, Y-хромосому R1a можно встретить не только у славян, но и у таджиков и у киргизов. Поэтому вообще непонятно, какие гены считать основным признаком.
                                Ответить
                              • Я считаю, что после всех катастроф, которые обрушились на Россию в двадцатом веке, начиная с первой мировой и заканчивая перестройкой, тот факт, что Россия еще сохранилась и развивается, говорит, что у нашего народа имеется одна лишняя хромосома.
                                Ответить
                            • Ваша великорусская мечта — сидя по горло в дерьме, затащить туда всех остальных. Это и есть русизм.
                              Ответить
              • Странно что любитель тестить старые фаерфоксы в XP в список не попал...
                Ответить
  • > Блядь, откуда, вроде всё в метр должно поместиться...

    Ну понятно, опять маркетинговое наебалово. L2 тоже "256 KB per core" а не "1.5MB shared". Т.е. надо втиснуть все горячие данные в 256КБ а не в 1.5 метра на самом деле.

    Выкинула нахрен std::unordered_set, подтюнила фильтр блума (2 теста по 20 бит).

    440 MH/s -> 470 MH/s

    Блин, ещё немножко...
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8