散列字节字符串

时间:2011-05-10 16:33:29

标签: c hash byte hashtable

我正在处理个人项目,文件压缩程序,并且我的符号字典出现问题。我需要将以前遇到的字节字符串存储到结构中,以便我可以快速检查它们的存在并检索它们。我一直在假设哈希表最适合这个目的,因此我的问题将与哈希函数有关。但是,如果有人可以建议更好的哈希表替代方案,我会全力以赴。 行。所以问题是我无法为这些字节串提供一个好的哈希键。我想到的一切都有非常不均匀的分布,或者需要太长时间。以下列出了我正在使用的情况:

  1. 所有字节字符串至少为 两个字节的长度。
  2. 哈希表的最大大小为3839,很可能会填满。
  3. 测试显示,对于任何给定字节,与低七位相比,最高位的设置可能性要小得多。
  4. 否则,字符串中的字节可以是0到255之间的任何值(我正在处理任何格式的原始字节数据)。
  5. 我在UNIX环境中使用C语言。我更喜欢坚持使用标准库,但它不需要可移植到其他操作系统。 (I.E. unistd.h很好)。
  6. 安全无关紧要。
  7. 速度是一个高度关注的问题。
  8. 尺寸不是很严重,因为它不会写入文件。但是,考虑到存储的字节字符串的潜在大小,压缩期间内存空间可能会成为一个问题。

1 个答案:

答案 0 :(得分:5)

trie更适合这种事情,因为它允许您将符号存储为树并快速解析它以匹配值(或拒绝它们)。

作为奖励,你根本不需要哈希。您正在同时存储/检索/比较整个序列,同时仍然只保留最少量的内存。

编辑:作为额外的奖励,只需要第二次解析,您就可以查找与当前序列“接近”的序列,这样您就可以删除序列并将前一个序列用于它们,用一些内部符号来保持差异。这将有助于您更好地压缩文件,因为:

  1. 较小的字典意味着较小的文件,您必须将字典写入您的文件
  2. 如果您添加人口上限并使用大文件点击,则较少数量的项目可以腾出空间来容纳其他更罕见的序列。