【问题标题】:Cumulative Hashes累积哈希
【发布时间】:2010-12-02 10:41:41
【问题描述】:

我之前在 SO (EDIT: Incremental Checksums) 上读到有一些校验和算法(我认为其中一个是 adler32)支持以下属性:

adler32('abc'); // 123
adler32('def'); // 456
adler32('abcdef'); // 579 (123 + 456)

请注意,结果只是示例,用于展示我想要归档的内容。我已经在 PHP 中使用 adler 和 fletcher 模块尝试了一些带有哈希扩展的示例,但这些值似乎没有加起来。有人可以给我看一些实现示例吗?

【问题讨论】:

  • 哈希(字符串){ 返回长度(字符串); } =)
  • 你有一个现实世界的问题吗?
  • Brian:不,我只是在 SO 的某个地方读到它,我发现它很有趣。这是否使它成为一个不太有效的问题?

标签: php string hash checksum adler32


【解决方案1】:

除非我有误解,否则我看不出如果没有不必要的碰撞次数是怎么可能的。

hash('cde') => 345 
hash('aaabcd') => 345

【讨论】:

  • 从技术上讲,没有冲突就不可能有哈希。 ;)
  • *修正:除非哈希大小大于最大数据大小
  • 好点,但似乎这种算法会产生不必要的数量。
  • 你能解释一下为什么这两者会发生碰撞吗?
【解决方案2】:

鉴于Alder32算法描述,我看不出你描述的关于字符串连接的属性是如何可能的。

编辑: 删除了有缺陷的演示,即这种哈希属性是不可能的。实际上,这种散列的一个示例是简单地添加(可能以某个大数字为模,但这是可以理解的)输入中字符的 ASCII 值。 (感谢 Pete Kirkham 指出我的这个错误)。

您可能指的是同态加密算法,而不是 Alder32。您可以找到此类加密方案的列表here。 IBM 的研究人员 Craig Gentry 也宣布他成功制作了 fully homomorphic encryption,但我不知道此时是否发布了任何技术细节(这将是个大新闻,顺便说一句)。

【讨论】:

  • 也不是通过将a、aa、aaa等放入textop.us/Hashing/Adler-32来展示的
  • OP 的要求是 hash('abcabc') = hash('abc')+hash('abc')=2*hash('abc'),所以对于任何x 使得 2 x = x + x。
  • Argh.. 我的坏,在我的沉淀中,我做了一个很大的 boo boo。让我把它搬出去……
【解决方案3】:

如果您要查找的是字符串上的散列函数,例如hash(s1+s2) = hash(s1) + hash(s2),我很确定所有具有此属性的散列函数都是(sum of the hash_char(c) for all the chars c in the string) 的形式,对于固定函数hash_char

这并不构成一个非常好的哈希函数。您不会记错您对 adler32 的看法吗?

【讨论】:

  • 证明:对于任何满足条件 hash(s1+s2) = hash(s1) + hash(s2) 的哈希函数,定义 hash_char(c)=hash("c")。那么对于任意字符串s=c1c2..cn,hash(s)=hash_char(c1)+...+hash_char(cn)。很适合查找字谜,但正如 Byron 所说,对于其他应用程序来说,碰撞太多了。
  • 有点延迟,但这里是:stackoverflow.com/q/1173481/89771
【解决方案4】:

Adler32 是一种校验和算法,而不是哈希算法,并且没有您描述的属性。

散列具有可以通过散列的结果来描述散列状态的属性是很常见的,所以如果

H(“aaa”)=G(H0,“aaa”)

其中 G 是散列和与散列连接的函数,H0 是初始值,通常为零。那么

H ( "aaa" ) = G ( H("aa"), "a" ) = G ( G ( H("a"), "a" ), "a" ) = G ( G ( G ( H0, "a" ), "a" ), "a" )

但是一个函数只是简单地将输入中的字符的一些函数加在一起(正如你的规则所暗示的那样 G ( x .concat. y ) = G(x) + G(y) )将碰撞所有该输入的排列。

一个这样的函数可能会从一个 ASCII 输入创建一个 128 位哈希:

H(x) = sum ( b => 1 << b foreach byte b in x ) 

这将具有

的属性
H("abcdef") == H("abc") + H("def") 
            == H("a") + H("b") + H("c") + H("d") + H("e") + H("f") 
            == H("abcdfe")
            == H("abcfde")
            == H("abcfed")
 etc.

【讨论】:

    【解决方案5】:

    Adler32 不是哈希函数。
    没有具有此属性的良好哈希函数。

    但是,也有具有类似属性的加密函数;称为homomorphism
    基本上:

    E(text1)*E(text2)=cipher  
    D(cipher) = text1 + text2  
    

    其中 E 是加密函数,D 是加密函数,文本是数字(或序列化为数字的数据)。请注意,确实存在使用 + & * 以外的操作的方案。

    两个示例方案:ElGamalPaillier。两者都是,这是非对称加密方案的共同特征。这两个示例都使用 * & +。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2012-05-22
      相关资源
      最近更新 更多