PHP - 计算两个字符串之间相似性的最佳哈希算法是什么?

时间:2016-05-27 07:37:28

标签: php string algorithm hash similarity

我想用hash()来计算/找到两个字符串之间的相似性。

在PHP中有许多支持的散列算法。可以使用hash_algos()获取列表。

哪种推荐算法最佳?

3 个答案:

答案 0 :(得分:4)

你的问题太模糊了。

首先,你说你想要计算两个字符串之间的相似性。这根本不需要散列。您可以使用compareequalitylevenshtein distanceedit distance等。

  

为什么我们使用散列

如果有一些我们无法以明文存储的敏感数据,我们不需要在任何处理,计算或修改数据中使用数据,只需要比较它为了完全平等,我们使用散列。 eg. storing user passwords, which would need only comparison with the password string once he tries logging in

  

参数

速度,安全性(也许是受欢迎程度)

一些最受欢迎的哈希包括md5, SHA-1, SHA-256 and SHA-512。这是他们安全且相对缓慢的顺序。

fast, less secure | md5 < SHA-1 < SHA-256 < SHA-512 | relatively slow, more secure

我建议使用SHA-1或SHA-256,它们足够快且足够安全。

此外,使用秘密盐可以将安全性提高多倍(使用salt时,散列会以指数方式增加安全性,原因很明显)。

答案 1 :(得分:2)

哈希与相似性无关。此外,大多数散列算法产生的结果几乎完全不同于非常相似的字符串。例如:SHA1:

The quick brown fox jumps over the lazy dog = 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

和一个符号的区别是完全不同的字符串:

The quick brown fox jumps over the lazy cog = de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3

有一些简单且知名的算法可用于查找字符串相似性。 Hamming distance表示相同长度的字符串,Levenshtein distance表示不同长度的字符串只是string metrics

的几个示例

P.S。如果你真的真的想使用散列 - 这种类型散列的正确术语是locality preserving hash。你可以阅读它here

答案 2 :(得分:1)

我建议您查看Nilsimsa算法进行介绍。

“ Nilsimsa的目标是生成电子邮件的哈希摘要 这样两个相似消息的摘要与每个相似 其他”

这里有一个php程序包(12

这里提到了更强的算法/更低的误报匹配TLSHSsdeepSdhash