【问题标题】:Convert any string into integer将任何字符串转换为整数
【发布时间】:2019-02-18 21:19:24
【问题描述】:

我想“创造性地”设置我的随机种子。就像np.random.seed(42) 这样的东西,读过《银河系漫游指南》的人会得到这个笑话。

但是我希望能够用字符串开始随机种子,例如引用。

类似于np.random.seed(str_to_int("I like cake")),为此我需要一个函数,将整数属性分配给字符串。

我愿意在我的字符串中只允许字母(如果必须是小写字母),如果这样可以使任务更容易。该函数不一定是随机的,但常数 0 函数以外的其他函数会很好。

【问题讨论】:

  • 你想要一个接受随机字符串并变成唯一整数的函数吗?
  • 是的,它必须是确定性的,因为我希望其他人能够以相同的结果运行相同的程序。
  • 您可以尝试int.from_bytes(str.encode()) 作为与答案不同的方法。
  • 没错。你看,当大多数选民做出错误的决定时,这些问题就会出现在“帮助和改进”队列中,供其他人编辑。谁应该通过编辑来解决问题。这是不可能的。因此,(经常)多数票是错误的。当您认为“ 可以解决此问题并通过对其进行编辑使其可以回答,但我现在不想这样做”时,您会选择“需要编辑”。否则,最好跳过或寻找有效的关闭原因(实际上应该关闭大多数分流条目)。
  • 除此之外:我很感激你的善意和快速的回​​归!

标签: python string python-3.x integer


【解决方案1】:

事实证明,至少在 Python 3 中,seed function can be seeded from a string.

在 Python 2 中,您可以使用 CRC of a string,然后是 use this as a seed

【讨论】:

  • 它也是确定性的,因为它不依赖于运行时随机化它可以做的哈希,而只依赖于字符串本身。
【解决方案2】:

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

print(hash("tata"))

输出:

2314062222093390636

这是一个整数,可用于以 int 为种子。

作为 UNIX 人 pointed outrandom.seed(..) 可以直接使用 str


来自@The Unix Man 的 cmets:python 哈希使用随机化,同一程序的不同运行会导致不同的哈希:更多内容将在此处阅读

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

和 param -R(为了兼容性而保留 - python 3.3+ 默认启用随机化)。


底线:

不要将 hash() 用于同一程序的不同运行,它是加盐的 - 并且会导致运行之间的哈希不同。

【讨论】:

  • 这个方法是确定性的吗?那就是当别人稍后运行它时,哈希函数会给出相同的结果吗?
  • 不是hash(-1) == hash(-2) # True
  • 对象的 python hash 不保证对每个对象使用相同的值。具体来说,从 3.3 开始,它“生成 str、bytes 和 datetime 的 __hash__() 值,用不可预测的随机值“加盐”(docs.python.org/3.3/using/cmdline.html)。这是为了帮助缓解ocert.org/advisories/ocert-2011-003.html
  • @TheUNIXMan wow - 所以让哈希产生相同值的唯一选择是将docs.python.org/3.3/using/cmdline.html#envvar-PYTHONHASHSEED指定为envc´var。感谢您的启发。
  • hash 值实际上只是一种优化,用于确定两个值是否是相同的“对象”。它主要由is 使用,并且不应真正用于其他用途。无论如何,为任何自定义值定义丰富的比较器要好得多,如果您需要真正的哈希,请使用秘密模块或加密哈希。
猜你喜欢
  • 2013-11-06
  • 1970-01-01
  • 2012-02-21
  • 2010-12-31
相关资源
最近更新 更多