【问题标题】:python hash function equivelantpython哈希函数等价物
【发布时间】:2019-10-08 20:40:44
【问题描述】:

我正在尝试找到与 python 的哈希函数等效的 Go:

hash("test")

我发现 this post 这是一个非常相似的函数,因为它返回一个整数,但是它使用 fnv,这似乎是与 python version 不同的散列方法

我要做的是将一个字符串传递给哈希函数,从而在两种语言中为相同的字符串返回完全相同的整数。

【问题讨论】:

  • 我不知道答案,但我很好奇你为什么需要这个
  • 它的工作原理是内部实现细节,更不用说对象可以有一个__hash__() 方法,这意味着它可以返回任何东西。
  • 看起来像XY Problem。你的实际目标是什么?
  • 感谢您的回复。我正在尝试确定字符串应该存储在哪个分片上。所以它只是将数据均匀地分布在一系列 MySQL 数据库中。我要去shard = md5(“1.2.3.4") % 4096。来自pinterest blog 的这一部分(请参阅帖子底部)。
  • 在这种情况下,Python 哈希函数是错误的解决方案,因为它会随着每次调用而改变。你需要一个稳定的散列函数。 md5 很好,但毫无疑问还有更快的选择。 CRC16 或 CRC32 可能没问题,除非您正在散列可能是用户操作的输入(在这种情况下,MD5 也不安全)

标签: python go hash


【解决方案1】:

默认情况下,str、bytes 和 datetime 对象的 __hash__() 值是用不可预测的随机值“加盐”的。尽管它们在单个 Python 进程中保持不变,但它们在 Python 的重复调用之间是不可预测的。

在 Python 脚本的不同调用之间,您将获得不同的数字。所以我不认为你想要什么是可能的。

来源:https://docs.python.org/3.5/reference/datamodel.html#object.__hash__

【讨论】:

  • 认为你可以停止随机化,不是吗?
  • @AdamSmith 这在一般应用程序中是相关的,但在内部我觉得很奇怪你不能 a) 修复种子或 b) 如果你不能至少抓住种子并传输它'确定不会出现这种情况
  • @roganjosh 您可以设置PYTHONHASHSEED(作为环境变量或从命令行)以获得可重现的随机序列,但我还没有找到一种方法来禁用加盐。
  • @AdamSmith 幸运的是,我在点击链接并扫描文档时偶然发现了这一点。
  • this 展示了如何禁用它:“...但是您可以将其设置为固定的正整数值,0 完全禁用该功能。”
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 2013-05-03
  • 2014-05-15
  • 2014-04-20
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多