arrays - 字符串数组作为哈希函数键?

标签 arrays string function hash key

在任何语言中(没关系),是否有可能拥有一个使用字符串数组作为键的哈希函数?

我的意思是这样的:

hash(["word1", "word2", ...]) = "element"

而不是经典:
hash("word") = "element"

我需要这样的东西,因为我想用作键的每个单词都可以更改函数的输出元素。我有一个单词序列,我想要该序列的特定输出(顺序也可能会改变结果)。

最佳答案

当然。任何数据结构都可以散列。您只需要提出一个严格的相等定义,然后确保 hash(A) == hash(B) if A == B。假设您的定义是 [s1, s2, ..., sm] == [t1, t2, ..., tn] 当且仅当 m == n 和 si == ti for i = 1..m 和进一步的字符串 s == t 当且仅当 |s|==|t|和 s[i]==t[i] 为 0<=i<|s|。您可以通过多种方式构建哈希:

  • 连接列表中的所有字符串,并使用任何字符串散列函数散列结果。
  • 执行相同操作,添加分隔符,例如逗号 (,)
  • 单独散列每个字符串并对结果进行异或。
  • 单独散列 eash 字符串,将先前的散列值移位,并将新值异或到散列中。
  • 无限多的可能性...

  • 对平等的严格定义很重要。例如,如果列表中的顺序无关紧要或字符串比较不区分大小写,则哈希函数仍必须设计为确保 hash(A) == hash(B) if A == B 。弄错了会导致查找失败。

    Java 是一种允许您为任何数据类型定义散列函数的语言。事实上,使用默认散列函数,字符串库列表可以作为键正常工作。
    HashMap<ArrayList<String>, String> map = new HashMap<ArrayList<String>, String>();
    
    ArrayList<String> key = new ArrayList<String>();
    key.add("Hello");
    key.add("World");
    
    map.put(key, "It's me.");
    // map now contains mapping ["Hello", "World"] -> "It's me."
    

    关于arrays - 字符串数组作为哈希函数键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865942/

    相关文章:

    arrays - 将数据帧转换为 3D 数组

    javascript - 如何修复 for..in 循环中的 "Uncaught ReferenceError"

    python - 将 numpy 数组从一个(2-D)复制到另一个(3-D)

    r - 在R中,如何通过分组变量将字符串变量折叠在数据框中?换句话说,垂直粘贴而不是水平粘贴

    c# - 在 C# 中生成多个唯一字符串

    c - 12 元素数组,仅初始化 7

    Java:字符串:equalsIgnoreCase vs 将所有内容切换为大写/小写

    c++ - 如何将此结构传递给可用函数?

    javascript - 如果没有 "function"关键字,这个对象方法定义如何工作?

    c++ - 为什么我们在传递给 C++ 中的函数时将数组大小指定为参数?