2012-10-12 47 views
6

是否有可能在任何语言(无所谓)中拥有一个使用字符串数组作为键的散列函数?作为散列函数键的字符串数组?

我的意思是这样的:

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

,而不是经典:

hash("word") = "element" 

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

+0

你可以串连列表中的元素,并使用基于字符串的函数 – Eduardo

+0

是的,但它是不可取的,因为数组在散列/类型的字典/映射可变的,易变的按键可能会导致奇怪的运行时错误。 –

+0

@AbhinavSarkar我不认为这个问题是可变的。在Java中,只要你能实现hashCode并且等于你的对象应该是值得的。所以你可以使用一个ArrayList作为关键字,只要你的hashCode/equals保证你期望的结果。 – gebuh

回答

4

当然。任何数据结构都可以被散列。你只需要提出严格的等式定义,然后确保散列(A)==散列(B)如果A == 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 |。您可以通过多种方式构建哈希:

  • 将列表中的所有字符串连接起来,并使用任何字符串哈希函数对结果进行哈希处理。
  • 做同样的事情,添加分隔符,如逗号(,)
  • 散列每个字符串单独和异或的结果。
  • 单独对散列字符串进行散列,将先前的散列值进行移位,并将新值写入散列。
  • 无穷多了更多的可能性...

平等Tigorous定义是很重要的。如果例如命令在列表中不重要,或者字符串比较不区分大小写,那么散列函数仍然必须被设计为确保散列(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

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

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

+0

其他答案最好解释一下,但我也要感谢你!您的链接将非常有帮助! – alextoind