В основном необходимо удостовериться, что Вы используете недавнюю версию John, которой включили поддержку OpenMP.
При компиляции его сами, необходимо явно включить поддержку OpenMP в make-файле (и проверить, что необходимые зависимости доступны - например, GCC> = 4.2).
Поддержка OpenMP не обязательно доступна для всех методов хеша, и общественный выпуск (-гигант) поддерживает больше, чем официальный.
С получающимся двоичным файлом можно проверить, имеет ли он OpenMP через вызов ldd
на нем - он должен отобразить некоторые связанные с членом парламента библиотеки. Также можно указать через переменную среды OMP_NUM_THREADS
количество ядер, которые программа OpenMP должна использовать - если это сброшено значение по умолчанию (на Linux) должно быть: все ядра.
См. также примечания по OpenMP в Wiki John's.
Вы можете использовать Perl
:
$ perl -e 'print pack "I>", shift' $(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))
dc
может принимать произвольный входной радиус и выходной сигнал на одинаково произвольном выходном радиусе. Вы связываетесь с dc
, передавая ему сначала значение (или строку значений, разделенных пробелом), а затем команду на обработку значения. По умолчанию dc
устанавливает базовый 10 радикс как для входа, так и для выхода.
Например, для преобразования произвольных десятичных значений в двоичные (или, как минимум, в базовые 2):
printf 2o%dp "'A" | dc
1000001
Это работает со следующим списком команд для dc
:
добавить 2 к вершине основного стека
вывести верхнее значение из основного стека и использовать его значение в качестве o
utput radix
добавить 65 (десятичное значение ASCII в пересчете на printf
в моей локали) к вершине Основной стек
выведет верхнее значение из основного стека и p
выведет его значение в stdout
в базу, которая в настоящее время указана как выходной радиус
dc
, также выведет значения ASCII для байтов, интерпретируемые его входным радиусом:
printf 8i%oP "'A" | dc
A
. ...и ...
printf 2i%sP 1000001 | dc
A
Процесс во многом такой же, как и раньше, за исключением того, что i
используется для задания i
выходного радикса в отличие от предыдущего o
выходного радикса и что P
используется для интерпретации значения верхнего стека в качестве символа ASCII на выходе.
bc
может делать многое из того же самого, хотя он имеет тенденцию к гораздо более многословному синтаксису. Однако man dc
и man bc
для более. битовых сдвигов нет ни в одном из репертуаров программы. Тем не менее, как вы показали, любой POSIX-оболочка может довольно легко справиться с этим с помощью арифметического расширения.
Вы можете использовать встроенную функцию printf
для выдачи байтов, заданных восьмеричными кодами.
x=1193046
printf "$(printf "\\%03o" $((x>>24&255)) $((x>>16&255)) $((x>>8&255)) $((x&255)))"