2011-09-01 131 views
3

我知道有很多隨機數字生成器,但我正在尋找一些可能更容易預測的東西。有沒有辦法得到一個「隨機」數字(在每個實例中都是相同的)給定一個字符串?我想在bash中做到這一點。我正在尋找一些比字符串中的字符更先進的東西,但不像其完整的校驗和那樣先進。如何根據Bash中的字符串獲取「隨機」數字?

最終目標是獲得一個十進制值,所以這可以針對一個字符串運行多次重複結果。

+5

爲什麼不使用像'md5sum'或'sha1sum'這樣的散列函數? 'echo -n「Hello World」| md5sum'。 –

+0

我同意,散列可能是最簡單的;我自己也用一個類似的目的。 – Kevin

+0

你說「不像完整的校驗和一樣先進」。爲什麼? 'sha1sum'很容易使用。 –

回答

6

你需要一個隨機數,但你不想要一個完整的校驗和,這是矛盾。我認爲md5sumsha1sum是很容易使用,並應滿足您的需求:

md5sum <<< "$your_str" 

sha1sum <<< "$your_str" 

更新:

如果需要十進制數字,只是:

n=$(md5sum <<< "$your_str") 
echo $((0x${n%% *})) 
+0

正是我在找的。謝謝穆。 –

+0

'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) –

2

該函數將用一個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 
+0

我可以在不產生10000個子殼體,管道和外部進程的情況下執行相同操作:'num-from-string(){local出ia; for((i = 0; i <$ {#1}; ++ i));做printf -v a「%d \ n」「'$ {1:i:1}」;出+ = $((一%10));完成;回聲「$出」; }'。沒有冒犯,但你的風格是可怕的。 –

+0

如何添加您在此使用的bashisms的詳細說明以獲取結果。該函數是開發簡單數字和唯一哈希的良好學習工具。 – Yokai

1
$ 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 
+1

3位數字的第一個解決方案在散列沒有3個連續小數的罕見情況下失敗。查看我的解決方案,總是返回3位小數。 –

1

散列字符串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位數時(例如, ffff65535
  • cut -c 1-4獲得前4位數字。
相關問題