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

时间:2012-10-12 19:39:14

标签: arrays string function hash key

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

我的意思是这样的:

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

而不是经典:

hash("word") = "element"

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

2 个答案:

答案 0 :(得分:4)

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

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

严格的平等定义很重要。例如,如果顺序在列表中无关紧要或者字符串比较不区分大小写,那么哈希函数仍必须设计为确保散列(A)==散列(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."

答案 1 :(得分:1)

是的,这是可能的,但在大多数情况下,您必须定义自己的哈希函数,将数组转换为哈希键。例如,在java中,array.hashCode()基于Object.hashCode()函数,该函数基于Reference本身而不是Object的内容。

如果您对构建在数组之上的散列函数的实现感兴趣,也可以查看Arrays.deepHashCode() function in java