我知道有很多随机数字生成器,但我正在寻找一些可能更容易预测的东西。有没有办法得到一个“随机”数字(在每个实例中都是相同的)给定一个字符串?我想在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'很容易使用。 –