内容可寻址存储系统使用存储数据的哈希值作为标识符和地址。碰撞非常罕见,但如果系统长时间大量使用,它可能会发生。如果有两条数据产生相同的哈希值会怎样?最近存储的一个获胜并且数据丢失是不可避免的,还是有可能设计一种方法来存储两者并允许访问两者?
为了缩小问题的范围,我想专注于 Camlistore。如果永久节点碰撞会发生什么?
内容可寻址存储系统使用存储数据的哈希值作为标识符和地址。碰撞非常罕见,但如果系统长时间大量使用,它可能会发生。如果有两条数据产生相同的哈希值会怎样?最近存储的一个获胜并且数据丢失是不可避免的,还是有可能设计一种方法来存储两者并允许访问两者?
为了缩小问题的范围,我想专注于 Camlistore。如果永久节点碰撞会发生什么?
假设没有发生碰撞。考虑到强大的哈希函数和随意的、非恶意的用户输入,这是一个完全合理的假设。Camlistore 目前使用的 SHA-1 也可以抵抗恶意尝试产生冲突。
如果哈希函数随时间变弱并需要停用,Camlistore 支持迁移到新 blobref 的新哈希函数,同时保持旧 blob ref 可访问。
据我所知,如果确实发生了冲突,那么第一个存储的带有该哈希的 blobref 将获胜。
来源:https ://groups.google.com/forum/#!topic/camlistore/wUOnH61rkCE
在理想的抗碰撞系统中,当摄取新文件/对象时:
所以不,信息在内容可寻址存储系统中丢失并非不可避免。
* 理想情况下,现有的存储数据将以相同的方式重新散列,并以某种方式标记原始散列条目(例如链接到零字节有效负载)以表示有多个存储对象最初解析为该散列(在概念上类似于维基百科上的“消歧义页面”)。这是否有必要取决于需要如何从系统中检索数据。
虽然故意引起冲突对于给定的算法可能在天文上是不切实际的,但随机冲突可能会在第二次存储事务时立即发生。
注意:一些小型/非关键系统会跳过二进制比较步骤,以换取带宽或处理时间的风险。(通常,只有在某些元数据匹配时才会这样做,例如文件名或数据长度。)
这种系统(例如单个git
存储库)的风险状况与摄取大量二进制数据的企业/云规模环境大不相同,特别是如果该数据是明显的随机二进制数据(例如加密/压缩文件)组合与滑动窗口重复数据删除之类的东西。
另见,例如:
复合键,例如 hash + userId