我有大量文本需要在它们之间进行比较,以检查它们是否相似。每件长约10000字 因此,我预先计算每一个的散列并比较散列。
问题是,哪种哈希算法会更好? MD5? SHA1? SHA256?或者也许是base64? 或者它真的不重要吗?
我知道即使是一个空格也可以改变哈希的值,这对我来说还不错。
答案 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 )。