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

ale*_*ind 6 arrays string hash key function

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

我的意思是这样的:

hash(["word1", "word2", ...]) = "element"
Run Code Online (Sandbox Code Playgroud)

而不是经典:

hash("word") = "element"
Run Code Online (Sandbox Code Playgroud)

我需要类似的东西,因为我想用作键的每个单词都可以改变函数的输出元素.我有一系列的单词,我希望该序列的特定输出(顺序也可能改变结果).

Gen*_*ene 4

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

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

对平等的严格定义很重要。例如,如果列表中的顺序并不重要,或者字符串比较不区分大小写,则哈希函数仍必须设计为确保 hash(A) == hash(B) 如果 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."
Run Code Online (Sandbox Code Playgroud)