可并行化的散列算法,其中子字符串的大小和顺序无关紧要

时间:2011-08-09 18:13:58

标签: properties ascii sum hash

修改

以下是我要解决的问题:

我有一个分成多个部分的字符串。这些部分的长度不相等或可预测。每个部分都有一个哈希值。当我连接部分时,我希望能够使用每个部分的哈希值来快速获取部分的哈希值。此外,通过将部分放在一起而生成的哈希必须匹配在字符串作为整体进行哈希处理时生成的哈希值。

基本上我想要一个散列算法,其中被散列的数据部分可以并行散列,我不希望碎片的顺序或长度很重要。我没有分解字符串,而是以不可预测的顺序以不可预测的方式接收它。

我愿意确保碰撞率提高,只要它不会太高。我也可以使用稍慢的算法,因为它在小字符串上几乎不可察觉,并且对于大字符串并行完成。


我所熟悉的几个散列算法,但是我现在有一个用例,用于与属性的散列算法,两个散列的总和等于两个项目的总和的散列。

要求/吉文斯

  • 此算法将散列长度至少为1个字节的字节串
  • hash(“ab”)= hash('a')+ hash('b')
  • 具有不同顺序的相同字符的字符串之间的冲突是可以的
  • 生成的散列应该是原始大小的整数(通常为32/64位)
  • 字符串可以包含0-256中的任何字符(长度已知,不是\ 0终止)
  • ascii字母数字字符是迄今为止最常用的字符
  • 不成比例的字符串数将是1-8个ASCII字符
  • 一小部分字符串实际上包含值为127或以上的字节

如果这是一种与其相关术语的算法,我很想知道这个术语。如果我知道这种类型的哈希算法的正确术语/名称是什么,谷歌会更容易。

我认为实现这一目标的最简单方法是:

  • 任何字节的散列都应该是其值,标准化为< 128(如果> 128减去128)
  • 要获取字符串的哈希值,请将每个字节规范化为< 128并将其添加到密钥
  • 根据密钥大小,我可能需要限制用于散列的字符数以避免溢出

1 个答案:

答案 0 :(得分:1)

我没有看到添加每个(无符号)字节值来创建一个哈希值只是所有字符总和的错误。有一个溢出没有错:即使你达到32/64位限制(并且它必须是一个非常/非常长的字符串来执行此操作)溢出为负数在2的补码算法中无关紧要。由于这是一个线性过程,因此拆分字符串并不重要。