[英]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接近b和b接近c并不意味着a接近c )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.