You can在 Python 脚本中设置 PYTHONHASHSEED,但它对hash()
function - 需要在解释器启动之前在解释器的环境中设置。
如何使用纯Python设置其值
诀窍是将环境变量传递给子进程中的 Python 解释器。
import random
from subprocess import call
random.seed(37)
cmd = ['python', '-c', 'print(hash("abc"))']
for i in range(5):
hashseed = bytes(random.randint(0, 4294967295))
print('\nhashseed', hashseed)
call(cmd, env={'PYTHONHASHSEED': hashseed})
output
hashseed 2929187283
-972692480
hashseed 393430205
2066796829
hashseed 2653501013
1620854360
hashseed 3616018455
-599248233
hashseed 3584366196
-2103216293
您可以更改cmd
列表,以便它运行hashtest.py
上面的脚本:
cmd = ['python', 'hashtest.py']
or if hashtest.py
是可执行的,
cmd = './hashtest.py'
通过通过dict
as the env
我们替换将传递给命令的默认环境参数。如果您需要访问其他环境变量,那么您应该修改os.environ
在调用脚本中,例如,os.environ['PYTHONHASHSEED'] = hashseed
.
如何使用 Bash 设置其值
首先,我们有一个简短的 Bash 脚本pyhashtest.bsh
使用 RANDOM 环境变量作为 PYTHONHASHSEED 的种子。必须导出该变量,以便 Python 解释器可以看到它。然后我们运行我们的Python脚本hashtest.py
。我们循环执行 5 次,这样我们就可以看到使用不同的种子对哈希值有影响。
Python 脚本hashtest.py
从环境中读取 PYTHONHASHSEED 并打印它以表明它具有我们期望的值。然后我们计算并打印短字符串的哈希值。
pyhashtest.bsh
#!/usr/bin/env bash
for((i=0; i<5; i++)); do
n=$RANDOM
echo "$i: Seed is $n"
export PYTHONHASHSEED="$n"
python hashtest.py
echo
done
哈希测试.py
#!/usr/bin/env python
import os
s = 'abc'
print('Hashseed is', os.environ['PYTHONHASHSEED'])
print('hash of s is', hash(s))
典型输出
0: Seed is 9352
Hashseed is 9352
hash of s is 401719638
1: Seed is 24945
Hashseed is 24945
hash of s is -1250185385
2: Seed is 17661
Hashseed is 17661
hash of s is -571990551
3: Seed is 24313
Hashseed is 24313
hash of s is 99658978
4: Seed is 21142
Hashseed is 21142
hash of s is -662114263
要运行这些程序,请将它们保存到同一目录中,例如运行 Python 脚本的常用目录。然后打开 Bash shell 并使用以下命令导航到该目录cd
命令。
例如,如果您已将脚本保存到/mnt/sda2/fred/python
那么你会做
cd /mnt/sda2/fred/python
接下来,制作pyhashtest.bsh
使用此命令可执行:
chmod a+x pyhashtest.bsh
然后运行它
./pyhashtest.bsh