【问题标题】:Is it possible to write hashing algorithm for following requirement?是否可以为以下要求编写散列算法?
【发布时间】:2017-07-12 21:27:49
【问题描述】:

所有输入都是小写英文字母。

HashString("ab")= should be unique value
HashString("ba")= should give me the same value as above

我尝试为每个字母分配一个数字,但结果证明是错误的逻辑

我的尝试产生了以下输出。

HashString("ab")=3
HashString("ba")=3 this is correct.
HashString("c")=3  this is wrong.

【问题讨论】:

  • 可以输入的最长的字符串是多少?
  • 您应该明确要求是什么。你的问题只提到了输入是小写字母的约束,函数应该是顺序不变的,“ba”和“c”不应该冲突,这是相当少的信息。
  • 为什么不对输入字符串中的字符进行排序,然后使用任何标准的哈希算法?
  • 任何可交换的? xor(hash(x), hash(reverse(x)))

标签: algorithm string-hashing


【解决方案1】:

在尝试解决问题时首先想到的是给每个字母分配一个质数,然后将它们相乘。那么,"ab" 是 2*3 = 6; "ba" 是 3*2 = 6; "c" 是 5。

【讨论】:

  • 应该注意,虽然这在理论上是一个很好的答案(如果你的整数任意大,它是无冲突的),但如果你的哈希值有很多(小),它在实际应用中是不利的除数。哈希图通常使用哈希值 mod n(对于一些可以变化的 n)。有许多除数会导致许多冲突 mod n。
【解决方案2】:

不,因为可能的字符串有无限多,但可能的 Hash 值的数量是有限的。

您不能在字符串上使用无冲突哈希函数,但您可以将函数设计为对预期输入值具有尽可能少的冲突。

【讨论】:

    【解决方案3】:

    正如其他人所提到的,您不能确保每个具有不同字母的字符串都会产生不同的哈希值,因为只有 2^32(或 2^64)个不同的哈希值可用,而且不同的字母组合比这更多.

    但是如果你只是想做一个不关心字符串中字符顺序的哈希函数,那么最简单的方法就是对字符串中的字符进行排序(所以“canada”会变成“aaacdn ",例如),然后对结果进行哈希处理。

    另一种常见的方法是将每个字符映射到一个看似随机的数字,然后将所有字符的数字相加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2023-01-11
      • 1970-01-01
      • 2016-07-06
      • 2021-03-28
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多