介绍
如果你的目标是获取一个bash变量,并且想要快速、消耗更少的资源,那么你可能想避免使用forks。(var=$(python ..)
)
因此,最快的方法是使用bash内置函数:
从5.1版本开始,bash提供了一个32位长度的$SRANDOM
伪随机变量:
SRANDOM
This variable expands to a 32-bit pseudo-random number each time
it is referenced. The random number generator is not linear on
systems that support /dev/urandom or arc4random, so each returned
number has no relationship to the numbers preceding it...
严格32个十六进制数字。
32个十六进制数字的随机字符串
你需要一堆 4 x 32 = 128
位 -> 4
x $SRANDOM
扩展
mkrand32(){
local -n resvar=$1
local _i _str _part
resvar=""
for _i in {1..4};do
printf -v part '%08x' $SRANDOM
resvar+=${part}
done
}
这个需要1个参数:您想要设置的变量名:
mkrand32 varname
echo $varname
d2fd20aad1b9dad4d57c478affa8503e
相同但不限于32位数:
mkrand () {
local -i _i=32 _p
[[ $1 == -l ]] && _i=$2 && shift 2
local -n resvar=$1
local _str _part
resvar=""
for ((_p=_i; _p>0; _p-=8)); do
printf -v part '%08x' $SRANDOM
resvar+=${part}
done
resvar=${resvar::_i}
}
与之前相同:默认为32位数字,但可以通过-l
开关进行修改:
mkrand test
echo ${#test} $test
32 70105167a19bea5a24c5e36571446f83
mkrand -l 23 test
23 7ce93dd418aacf5bbbaace6
mkrand -l 128 test
echo ${#test} $test
128 5f0707dd58f652f55d048305377be9686d5adaec26176dcedfa1505c457b90b25c13e4a9b61bbe880ad31bca89d3c8d0433f5219cebf159925059318f7047fec
注意:这里不使用getopts
,因此-l
必须通过空格分隔为数字
带选项的完整函数
您可以在我的网站上(而非GitHub)找到{{link1:mkrand的完整版本}}({{link2:mkrand.bash}})源脚本。
一旦加载:
Usage: mkrand [-h] [-a|-d|-x] [-d [-m int]] [-v varname]
-h Show this.
-a Alternative set of 64 chars ( alpha numerics + % + # )
-d Digits only
-x Hexadecimal characters (default)
-l int Length of generated srting (without separators)
-m int Mask for separators (default 0x888800: 1<<23|1<<19|1<<15|1<<11)
-s char Character to be user as separator (default "-")
-v name Variable name to be populated instead of print to STDOUT
Without argument mkrand will print UUID like 32 hexadecimal string.
513ee11e-d6cc-b7b1-8fd9-3462675e93d5
With `-m 0` or `-s ''`, noseparator will by added.
Mask for separator is a binary value, used to determine where to insert dash.
To generate an alpha numeric string of 30 characters, separated every 5 char:
mkrand -al30 -m0x1084210 -s' '
3PiQo 9RXFn NIi#7 %spWG HREhx wNamf
A string of 7 bunch of 6 digits, separated by a spaced dash:
mkrand -d -l 42 -m 0x820820820 -s ' - '
941908 - 240445 - 797528 - 631958 - 635053 - 160422 - 92710
mkrand
8eea4296-ffda-ee9a-6fbe-a349c0d7ff18
mkrand -al 54 -m0xaaaaaaaaaaaaa
tF-Zs-r7-bS-3D-AR-m2-S0-GC-lC-SU-k2-Zk-4f-eG-5f-qa-6f-vV-wV-Wc-zA-5Z-dC-Yg-Oz-w6
mkrand -m0
c751eb64b899448a06cf7391d2a009a9
head -c16 </dev/urandom|xxd -p -u
?该命令会生成一个随机的16进制字符串。 - Biffenhead -c 16 /dev/urandom | xxd -p
以提高可读性。 - undefinedhead -c 32 /dev/urandom | xxd -p -c 32
。 - undefined