Как получить «случайное» число на основе строки в Bash? - PullRequest
3 голосов
/ 01 сентября 2011

Я знаю, что существует множество генераторов случайных чисел, но я ищу что-то, что может быть немного более предсказуемым.Есть ли способ получить «случайное» число (одно и то же в каждом случае) по заданной строке?Я хотел бы сделать это в Bash.Я ищу что-то более сложное, чем количество символов в строке, но не такое сложное, как полная контрольная сумма.

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

Ответы [ 4 ]

6 голосов
/ 01 сентября 2011

Вам нужно случайное число, но вам не нужна полная контрольная сумма, это противоречие .Я думаю, md5sum и sha1sum действительно просты в использовании и должны соответствовать вашим потребностям:

md5sum <<< "$your_str"

или

sha1sum <<< "$your_str"

Обновление:

Если вам нужнодесятичные числа, просто:

n=$(md5sum <<< "$your_str")
echo $((0x${n%% *}))
2 голосов
/ 14 декабря 2016

Для хеширования строки abc с точностью до 3 десятичных знаков:

echo $((0x$(echo abc | md5sum | cut -f 1 -d " " | cut -c 1-3))) | cut -c 1-3

Чтобы получить, например, 4 десятичных знака вместо 3, замените два вхождения 3 на 4:

echo $((0x$(echo abc | md5sum | cut -f 1 -d " " | cut -c 1-4))) | cut -c 1-4
  • $(echo abc | md5sum | cut -f 1 -d " " | cut -c 1-4) дает шестнадцатеричное число из 4 цифр.
  • $((0xHEX)) преобразует шестнадцатеричный (HEX) в десятичный, который может иметь более 4 цифр, даже если HEX имеет 4 цифры, например, ffff - это 65535.
  • cut -c 1-4 получает первые 4 цифры.
2 голосов
/ 08 сентября 2016
$ echo abc | md5sum | grep -Eo "[[:digit:]]{3}"  | head -n1
Result -> 248
$ echo xyz | md5sum | grep -Eo "[[:digit:]]{3}"  | head -n1
Result -> 627

Совмещены другие ответы!

Для цветов HEX

echo abc | sha1sum | grep -Eo "[a-f0-9]{6}"  | head -n1
03cfd7
echo abc | sha256sum | grep -Eo "[a-f0-9]{6}"  | head -n1
edeaaf
echo abc | sha512sum | grep -Eo "[a-f0-9]{6}"  | head -n1
4f285d
2 голосов
/ 31 декабря 2012

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

num-from-string() {
    local out i a
    for ((i=0;i<${#1};++i)); do
        printf -v a "%d\n" "'${1:i:1}"
        out+=$((a%10))
    done
    echo "$out"
}

Пример:

$ num-from-string abc123
789901
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...