我应该使用哪种哈希算法来比较文本?

时间:2017-01-18 09:16:54

标签: python algorithm hash text-processing similarity

我有大量文本需要在它们之间进行比较,以检查它们是否相似。每件长约10000字 因此,我预先计算每一个的散列并比较散列。

问题是,哪种哈希算法会更好? MD5? SHA1? SHA256?或者也许是base64? 或者它真的不重要吗?

我知道即使是一个空格也可以改变哈希的值,这对我来说还不错。

2 个答案:

答案 0 :(得分:0)

使用zlib.crc32然后对匹配哈希的文本进行文本比较以确保。

答案 1 :(得分:0)

散列何时起作用?

哈希所做的是减少搜索空间,以便更快地找到等效项目。只要有可靠的方法为canonical value的所有成员生成单个equivalence class,它就会起作用。

在等效字符串中选择唯一值

在散列之前,需要将字符串转换为规范值(所有等效字符串中的一个唯一表示)。

  

我知道即使是一个空格也可以改变a的值   哈哈,对我来说没关系。

对于您的应用程序,这里有可能只删除空格的规范化函数:

>>> def canonical(s):
        return ''.join([c for c in s if not c.isspace()])

>>> s = 'the   quick\nbrown\tfox jumped'
>>> t = '  the\tquick   brown  fox  jumped'
>>> canonical(s)
'thequickbrownfoxjumped'
>>> canonical(t)
'thequickbrownfoxjumped'

应用哈希函数

sha256()很快,几乎没有误报的可能性。

在Python 2中,您可以直接从字符串计算sha256。但是,在Python 3中,必须首先将字符串编码为字节:

>>> from hashlib import sha256
>>> sha256(canonical(s).encode()).hexdigest()
'2c31c202821431b015cb800ab6315289884e87f1ed023abc876915685c620919'
>>> sha256(canonical(t).encode()).hexdigest()
'2c31c202821431b015cb800ab6315289884e87f1ed023abc876915685c620919'

什么时候没有哈希工作?

如果您只想按text similarity进行分组,则哈希也不起作用,因为没有直接的方法可以选择代表性元素,因为相似性并非如此transitive relation a 接近 b b 接近 c 并不是<\ n>暗示 a 接近 c )。