一句话定义:内容寻址存储(Content-Addressable Storage,CAS)用数据内容的哈希值当"门牌号"来存取数据——按内容找数据,而不是按位置找。
打个比方
传统存储像酒店房号:301 住的是谁、放的什么行李,和房号毫无关系;同一件行李存两次,就占两个房间。CAS 像按指纹归档:这箱东西的指纹是 abc123,就放进 abc123 号格子;下次拿到同样的东西,算出来还是 abc123,直接复用。地址不是管理员分配的,是从内容算出来的。
哈希(hash)就是这个指纹函数:输入任意长度的数据,输出固定长度的一串字符,内容改一个字节,输出就面目全非。
去重为什么是白送的
地址由内容决定,"内容相同"和"地址相同"是同一件事。写入前先算哈希,发现这个地址已经存在,就什么都不用干,只加一个指针。传统存储要专门跑一遍去重扫描,CAS 不需要——这不是额外功能,是寻址规则的副产品。分块之后更明显:两个文件只有中间一段不同,其余分块地址完全一致,天然共享。Git 存版本历史、容器镜像分层、IPFS 都靠这个。
校验为什么也是白送的
读取时重算一遍哈希,和地址比对,不一致就说明数据损坏或被篡改。地址本身就是校验值,不用额外维护校验清单,也不必信任存储介质本身。Git 能发现仓库损坏、区块链能串起哈希链,都是这个道理。
| 对比 | 位置寻址(传统) | 内容寻址(CAS) |
|---|---|---|
| 地址来源 | 人为分配(路径、块号) | 由内容哈希算出 |
| 同一份数据存两次 | 占两份空间 | 自动合并 |
| 完整性校验 | 额外维护校验文件 | 读时重算哈希 |
| 改一个字节 | 原地覆盖 | 生成新地址,旧的还在 |
| 典型代表 | 本地文件系统 | Git、IPFS、镜像层 |
和相邻概念的区别
键值存储(Key-Value Store)的 key 是你自己起的,想叫什么叫什么;CAS 的 key 是算出来的,没得选。这份"不能起名"的约束,换来的正是去重和校验。对象存储若用哈希当 key,也就成了 CAS 的一种用法。
对从业者意味着什么
内容一变地址就变,所以 CAS 里的对象天然不可变、天然只读,缓存和并发都好处理。CDN 和模型权重分发用哈希当文件名,同一哈希永远对应同一份内容,可以放心长期缓存。要留心的是分块粒度(越细去重越强,元数据也越多)、旧内容的引用计数回收,以及哈希算法的选择。具体实现以各项目官方页面为准。
