【问题标题】:What are potential hashing algorithms for strings in pure Python? [duplicate]纯 Python 中字符串的潜在哈希算法是什么? [复制]
【发布时间】:2015-08-01 20:06:38
【问题描述】:

标准的hash('hello') 函数可能会在不同的机器、不同版本的 Python 甚至同一程序在同一 Python 版本/机器上的不同运行时生成不同的哈希值。

什么是体面的纯 Python(或内置)替代品,碰撞几率低?我追求的用例是检查数据库中字符串的唯一性(注意:它不必是 100% 万无一失的,只是极不可能与另一个字符串发生冲突)。

【问题讨论】:

标签: python hash


【解决方案1】:

试试 python hashlib。它具有 MD5、SHA1、SHA224、SHA256、SHA384 和 SHA512 的实现,应该可以为您提供良好的哈希值,并且冲突的可能性很小。

示例输入:

import hashlib
hashed_string = hashlib.sha512("hello").hexdigest()
print hashed_string

输出:

9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

【讨论】:

  • 请注意,这些是加密和慢速哈希。 OP 的问题是默认 hash 位于不同的域中。
  • 我不会每秒执行数千个这样的操作,所以我认为hashlib 会这样做,但是是的,我更愿意找到一个非加密的纯 Python 解决方案。我还会研究 Murmurhash。
【解决方案2】:

Murmurhash 是非加密用途的理想选择(与 hashlib 不同,后者使用慢速加密哈希),原因有很多:

  • 使用非常广泛

  • 不仅可以跨 Python 版本和机器,还可以跨不同的语言进行移植

Here 是它的 Python 绑定。 Here 是关于算法本身的问题。


如果出于某种技术原因,可能需要纯 Python 自行实现,则有一些可行的选择:

  • murmurhash 的源代码在上面的第一个链接中,但是,在纯 Python 模式下,可能应该用更简单的东西代替

  • 直接候选人是KnuthJenkins

【讨论】:

  • 谢谢。是否有可以在不允许 C 模块的环境中运行的包?
  • 我不确定。什么是“不允许 C 模块的环境”:技术或组织环境?这取决于...
  • App Engine 运行(我相信)一个修改版的 pypy,由于其沙盒,它有很多限制。基本上,我不能运行任何编译的东西,它必须完全用 Python 编写。
  • 查看更新。希望对您有所帮助。
  • 谢谢。您知道它们在随机分布和碰撞率方面与 FNV-1a 相比如何吗?
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2012-03-25
  • 2015-10-27
  • 2011-08-24
相关资源
最近更新 更多