【发布时间】:2013-05-22 15:02:39
【问题描述】:
我必须处理数字序列,其中序列具有以下属性:
- 元素是整数,
- 序列的长度不同且不固定,
- 整数有一个上限,
- 允许元素多次出现,
- 元素的顺序无关紧要。
给定一个序列,我想知道这个序列是否已经发生,即我想对序列进行哈希处理。例如,
[2, 3, 6, 2, 13]
和
[6, 3, 2, 13, 2]
应该具有相同的哈希值。
使用的编程语言是 C。
我知道我可以先对序列进行排序,然后将它们存储在 trie 中,这绝对是一种选择。然而,什么是适合此目的的散列函数?
【问题讨论】:
-
所以它们真的比序列更多,对吧?既然顺序无关紧要?
-
一个普通的旧 XOR 将是一个合理的起点。
-
“整数可能有一个事先不知道的上限”...如果有有限多个集合,并且每个集合的大小有限,那么您可以更具体并声明“整数肯定有一个上限……”。虽然我不完全确定这个事实是否真的与这个问题有关。一个想法是将每个集合放入某种规范形式(例如对其进行排序),并生成一个良好的哈希(MD5,SHA-*,取决于您期望拥有多少),并存储它。 /跨度>
-
hash = a[0] xor a[1] xor a[2] xor a[3] xor ... -
需要注意的重要一点是,无论顺序如何,您都需要相同的哈希值。这意味着您要么需要一个不区分顺序的散列,要么需要在散列之前将元素按规范顺序放置(即对它们进行排序)。不区分顺序的散列将是加法(带有溢出)、XOR 和一些分类的 bit-bashing 技术。 “罐装”哈希算法通常(按设计)不是顺序不敏感的,这意味着您必须在应用它们之前进行排序。
标签: hash