将任何字符串转换为整数

3
我想要以有创意的方式设置我的随机种子。就像这样np.random.seed(42),读过《银河系漫游指南》的人会明白其中的笑话。
然而我希望能够使用一个字符串来开始随机种子,例如引用语。
这就需要一个函数将字符串转化为整数:np.random.seed(str_to_int("I like cake"))
如果有必要,我愿意只允许在我的字符串中使用字母(即使是小写字母),以便使任务更容易完成。该函数不一定是随机的,但与恒定的 0 函数相比,其他函数会更好些。

你需要一个函数,将随机字符串转换为唯一的整数吗? - Işık Kaplan
是的,它必须是确定性的,因为我希望其他人能够运行相同结果的程序。 - Jürg W. Spaak
你可以尝试使用int.from_bytes(str.encode())作为不同的方法来解决问题。 - Işık Kaplan
1
没错。你看,当大多数投票者做出错误的决定时,这些问题就会出现在“帮助和改进”队列中,由其他人进行编辑修复。但是在这里无法进行编辑修复。因此,(太常见了)大多数投票是错误的。当你认为“可以通过编辑来修复这个问题并使其可回答,但我现在不想这样做”时,你就会选择“需要编辑”。否则,最好跳过或寻找有效的关闭原因(实际上,triage上的大多数条目都应该被关闭)。 - GhostCat
1
除此之外:我感谢您的友善和快速回复! - GhostCat
2个回答

5

它也是确定性的,因为它不依赖于运行时随机化哈希(尽管它可以这样做),而仅依赖于字符串本身。 - user554538

3
您可以使用hash()函数将字符串转换为整数:
print(hash("tata"))

输出:

2314062222093390636

这是一个整数,可用于与int一起作为种子。

正如UNIX Man所指出的,random.seed(..)可以直接使用str


来自@The Unix Man的评论:Python哈希使用随机化,同一程序的不同运行会导致不同的哈希值:更多信息请阅读

https://docs.python.org/3.3/using/cmdline.html

参数-R(为了兼容性而保留- Python 3.3+默认启用随机化)。


底线:

不要在同一个程序的不同运行中使用hash(),它是有盐的 - 这将导致不同运行之间的不同哈希。


这个方法是确定性的吗?也就是说,当其他人稍后运行它时,哈希函数会给出相同的结果吗? - Jürg W. Spaak
除了 hash(-1) == hash(-2) # True 之外,它就是这样的。 - Işık Kaplan
Python中对象的哈希值不能保证对于每个对象都使用相同的值。具体来说,从3.3版本开始,“str,bytes和datetime的__hash __()值会被不可预测的随机值“加盐””(https://docs.python.org/3.3/using/cmdline.html)。这是为了帮助缓解http://ocert.org/advisories/ocert-2011-003.html。 - user554538
1
@TheUNIXMan 哇 - 所以让哈希产生相同值的唯一选项是指定 https://docs.python.org/3.3/using/cmdline.html#envvar-PYTHONHASHSEED 作为 envc´var。感谢您的启示。 - Patrick Artner
hash 值实际上只是用于查找两个值是否为同一“对象”的优化。它主要被 is 使用,并且不应该用于任何其他用途。无论如何,最好为任何自定义值定义丰富的比较器,如果需要真正的哈希,则使用 secrets 模块或加密哈希。 - user554538

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接