我知道有很多隨機數字生成器,但我正在尋找一些可能更容易預測的東西。有沒有辦法得到一個「隨機」數字(在每個實例中都是相同的)給定一個字符串?我想在bash中做到這一點。我正在尋找一些比字符串中的字符更先進的東西,但不像其完整的校驗和那樣先進。如何根據Bash中的字符串獲取「隨機」數字?
最終目標是獲得一個十進制值,所以這可以針對一個字符串運行多次重複結果。
我知道有很多隨機數字生成器,但我正在尋找一些可能更容易預測的東西。有沒有辦法得到一個「隨機」數字(在每個實例中都是相同的)給定一個字符串?我想在bash中做到這一點。我正在尋找一些比字符串中的字符更先進的東西,但不像其完整的校驗和那樣先進。如何根據Bash中的字符串獲取「隨機」數字?
最終目標是獲得一個十進制值,所以這可以針對一個字符串運行多次重複結果。
你需要一個隨機數,但你不想要一個完整的校驗和,這是矛盾。我認爲md5sum
和sha1sum
是很容易使用,並應滿足您的需求:
md5sum <<< "$your_str"
或
sha1sum <<< "$your_str"
更新:
如果需要十進制數字,只是:
n=$(md5sum <<< "$your_str")
echo $((0x${n%% *}))
正是我在找的。謝謝穆。 –
'md5sum <<<「$ your_str」'使用[<<< herestring](http://linux.die.net/abs-guide/x15683.html)bash功能。 '$ {n %% *}'提取md5sum返回的2個字段中的第一個,這是md5哈希。它通過從變量末尾刪除[子串最長匹配](http://tldp.org/LDP/abs/html/string-manipulation.html)「*」來實現。 '$((0x ________))'將十六進制md5sum從十六進制(基數爲16)轉換爲十進制(基數爲10) –
該函數將用一個eq替換字符串中的每個字符單位十進制數字。這是對我的原始版本的改進,張貼在評論中。
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
我可以在不產生10000個子殼體,管道和外部進程的情況下執行相同操作:'num-from-string(){local出ia; for((i = 0; i <$ {#1}; ++ i));做printf -v a「%d \ n」「'$ {1:i:1}」;出+ = $((一%10));完成;回聲「$出」; }'。沒有冒犯,但你的風格是可怕的。 –
如何添加您在此使用的bashisms的詳細說明以獲取結果。該函數是開發簡單數字和唯一哈希的良好學習工具。 – Yokai
$ 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
3位數字的第一個解決方案在散列沒有3個連續小數的罕見情況下失敗。查看我的解決方案,總是返回3位小數。 –
散列字符串abc
至3小數:
echo $((0x$(echo abc | md5sum | cut -f 1 -d " " | cut -c 1-3))) | cut -c 1-3
爲了得到例如4位小數,而不是如圖3所示,通過4
取代的3
兩次出現:
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位16進制。$((0xHEX))
將十六進制(HEX
)轉換爲十進制,即使當HEX
有4位數時(例如, ffff
是65535
。cut -c 1-4
獲得前4位數字。
爲什麼不使用像'md5sum'或'sha1sum'這樣的散列函數? 'echo -n「Hello World」| md5sum'。 –
我同意,散列可能是最簡單的;我自己也用一個類似的目的。 – Kevin
你說「不像完整的校驗和一樣先進」。爲什麼? 'sha1sum'很容易使用。 –