繁体   English   中英

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

[英]Which hashing algorithm should I use to compare pieces of text?

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

问题是,哪种哈希算法会更好呢? md5? sha1? sha256? 还是base64? 也许这根本不重要?

我知道,即使单个空格也可以更改哈希值,我也可以。

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

哈希何时生效?

哈希的作用是减少搜索空间,以便可以更快地找到等效项。 只要有可靠的方法为等效类的所有成员生成单个规范值 ,它就起作用。

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

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

我知道,即使是单个空格也可以更改哈希值,我也可以。

对于您的应用程序,以下是可能的规范化功能,它仅删除空白:

>>> 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'

什么时候不进行哈希运算?

如果您只想按文本相似性分组,则散列效果也不好,因为没有一种直接的方法来选择代表元素,并且因为相似性不是传递关系a接近bb接近c并不意味着a接近c )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM