【问题标题】:PHP - What is the best hash algorithm to calculate the similarity between two string?PHP - 计算两个字符串之间相似度的最佳哈希算法是什么?
【发布时间】:2016-09-25 10:38:28
【问题描述】:

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

在 PHP 中有许多受支持的散列算法。可以通过hash_algos(获取列表。

最好的推荐算法是什么?

【问题讨论】:

  • 您如何定义“最佳推荐算法”,最快或最安全……还是最精确?
  • 如果这些只是字符串,我当然会使用:php.net/manual/en/function.levenshtein.php 如果你想知道两个字符串完全相同,请使用:php.net/manual/en/function.strcmp.php
  • @RomanPerekhrest 最快。
  • @Viktor Koncsek levenshtein 算法的复杂度为 O(m*n),其中 n 和 m 是要比较的字符串的长度。这就是我使用哈希函数的原因。
  • 比如何定义“最佳”更重要的是如何定义“相似”。 你想做什么?

标签: php string algorithm hash similarity


【解决方案1】:

你的问题太含糊了。

首先,您说要计算两个字符串之间的相似度。这根本不需要散列。您可以使用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,它们足够快且足够安全。

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

【讨论】:

  • 这如何回答这个问题?
  • 他向推荐的算法询问哈希...我给了他名字。这怎么不回答这个问题?如果您想添加一些详细信息,我很乐意添加。
【解决方案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 的几个示例

附:如果你真的很想使用散列——这种散列的正确术语是locality preserving hash。你可以阅读它here

【讨论】:

    【解决方案3】:

    我建议查看Nilsimsa 算法的介绍。

    "Nilsimsa 的目标是生成电子邮件消息的哈希摘要 使得两个相似消息的摘要彼此相似 其他”

    这里有一个php包(1,2)

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

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2020-03-03
      • 2011-07-16
      • 2021-10-01
      相关资源
      最近更新 更多