2011-09-01 90 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位数字。
相关问题