[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f7IFVLNCkHtzCqw4ou1BhUB1klOgvlXAJscDLKfBFCUQ":3},{"item":4,"related":51},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":43,"seoDescription":44,"canonicalUrl":45,"isFeatured":46,"sno":47,"sortOrder":48,"publishedAt":49,"updatedAt":50,"createdAt":50},"54d83c94-d588-400d-9d13-42daa20331e2","article","CAS：文件的身份可以由内容决定","content-addressable-storage-ai-coding","内容寻址存储 CAS 用内容摘要识别文件和构建产物，解释 AI 编程工具、容器和缓存为什么能复用结果。","## CAS：文件的身份可以由内容决定\n\n普通文件通常靠路径和文件名寻找：`\u002Fproject\u002Fdist\u002Fapp.js`。内容寻址存储，Content-Addressable Storage，简称 CAS，则用内容计算出的摘要作为身份。内容不变，摘要就不变；内容改变，摘要也会改变。名字可以变化，内容身份仍然可验证。\n\n## 它和普通缓存有什么不同\n\n普通缓存常常依赖人为命名，例如“最新构建”“昨天的依赖”。这些名字可能被覆盖，也可能指向不再相同的内容。CAS 通过哈希把对象和实际字节绑定起来，工具可以先判断“这个摘要是否已经存在”，存在就复用，无需重新下载或重新构建。\n\n容器镜像层、编译产物、远程构建缓存和分布式对象存储，都可以使用这种思路。OCI 镜像规范中的内容描述符就包含内容类型、大小和摘要，消费者可以用摘要核对取回的数据。\n\n## AI 编程为什么会用到 CAS\n\nAgent 工作时经常重复读取依赖、运行测试和生成构建产物。如果每次都从头开始，成本很高。基于内容的缓存可以告诉系统：输入源代码、工具和配置都没变，这一步的输出可以直接复用。\n\nCAS 也提供了一种证据。AI 说“这是刚刚生成的产物”时，工具可以记录产物摘要；之后下载、部署或审查时，再验证摘要是否一致。这样，模型的文字总结就不再是唯一记录。\n\n## 哈希不是魔法护盾\n\n摘要能检测内容是否发生变化，但不能说明内容本身是否安全，也不能证明生成它的过程没有被篡改。若攻击者控制了可信入口，恶意内容仍可以获得一个全新的摘要。因此，CAS 常和签名、来源证明、权限控制一起使用。\n\n## 怎样把它用在个人项目中\n\n不必先搭建复杂的远程缓存。你可以先理解锁文件、构建缓存和容器层为什么都倾向于记录具体内容摘要；当 AI 修改依赖或构建配置时，注意哪些输入变化会让缓存失效，也要确认缓存复用不会掩盖真实构建问题。\n\nOCI 对内容描述符和摘要校验的说明见 [OCI Image Specification](https:\u002F\u002Fgithub.com\u002Fopencontainers\u002Fimage-spec\u002Fblob\u002Fmain\u002Fdescriptor.md)。","\u002Fuploads\u002F2026-09-14\u002F3fab23b3-8bcd-4a3b-bf5a-2ab895ce3a10.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"0848beb4-db26-4fb8-b391-f852a11be192","AI编程","ai-coding",{"id":28,"name":29,"slug":30},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev","官方资料","Open Container Initiative","https:\u002F\u002Fgithub.com\u002Fopencontainers\u002Fimage-spec\u002Fblob\u002Fmain\u002Fdescriptor.md","published","CAS 内容寻址存储是什么？AI 编程缓存如何工作","从内容摘要出发，理解构建缓存、容器镜像和软件产物为什么能按内容复用。",null,false,41,0,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:41.114Z",[52,60,68],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":49,"createdAt":59},"1be15b45-ad30-4bbf-b711-718a9ffc58b3","Tree-sitter：为什么编辑器不用每次重读整个文件？","tree-sitter-incremental-parsing-ai-coding","Tree-sitter 用增量解析和语法树帮助编辑器与 AI 编程工具只处理代码变化的局部，让搜索、补全和结构化修改更高效。","\u002Fuploads\u002F2026-09-14\u002Fc4a4730d-34e0-43bb-8d5c-bd79b20e1969.jpg",47,"2026-09-14T15:01:26.675Z",{"id":61,"type":6,"title":62,"slug":63,"summary":64,"coverUrl":65,"authorName":14,"sno":66,"publishedAt":49,"createdAt":67},"373f9a49-3705-46dc-823c-7ef1923f1b54","OpenAPI 如何让 AI 同时写前后端不“各说各话”？","openapi-ai-frontend-backend-contract","AI 可以分别生成前端和后端，却容易在字段、错误和时间格式上互相错位。本文解释 OpenAPI 如何把接口输入输出变成共同契约，再连接生成代码和契约测试。","\u002Fuploads\u002F2026-09-14\u002F4e99751f-020c-45dd-a87d-1a9fbb8f0f83.jpg",48,"2026-09-14T11:00:08.021Z",{"id":69,"type":6,"title":70,"slug":71,"summary":72,"coverUrl":73,"authorName":14,"sno":74,"publishedAt":49,"createdAt":75},"b12a5d11-9995-4996-9517-451945ab9267","Hermetic Build：让构建不再偷偷依赖你的电脑","hermetic-builds-ai-coding","Hermetic Build 通过隔离工具、依赖和环境，减少“在我电脑上能运行”的问题，让 AI 编程更容易获得稳定反馈。","\u002Fuploads\u002F2026-09-14\u002F0a4eec65-0454-4f9d-9d96-e55b7644618d.jpg",49,"2026-09-14T15:01:37.834Z"]