[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fiEquYX4267m6owKK_4fqnAE__l4qDK8IGS73SfpMU4U":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},"64882312-752b-441c-aa28-8f57479c2329","article","Merkle DAG：为什么一处改动可以快速传遍依赖关系","merkle-dag-ai-coding","Merkle DAG 用带哈希的有向无环图表达对象和依赖变化，帮助理解 Git、容器镜像和 AI 编程缓存的完整性机制。","## Merkle DAG：为什么一处改动可以快速传遍依赖关系\n\nMerkle DAG 可以理解为“带哈希指纹的有向无环图”。每个节点不仅保存自己的内容，还保存子节点或依赖节点的摘要。只要底层某个内容变化，上层节点的指纹就会随之变化。这样，系统可以快速发现一个对象以及它依赖的对象是否发生过改变。\n\n## 它和普通树有什么区别\n\n普通树强调父子层级，而 Merkle DAG 允许多个节点共享同一个子节点，也不要求所有对象只有一个父节点。节点通过摘要引用内容，关系既能表达结构，又能提供完整性校验。\n\nGit 的对象模型、内容寻址存储和 OCI 容器镜像，都能看到相似思路。OCI 镜像规范明确描述了由多个组件组成的 Merkle DAG，并用内容描述符连接这些组件。\n\n## AI 编程为什么值得理解它\n\n大型项目的上下文不是一堆孤立文件，而是文件、依赖、构建步骤和产物组成的关系网络。AI Agent 如果能根据摘要和依赖关系判断哪些节点发生变化，就可以把注意力放到受影响的部分，而不是每次重新扫描全部仓库。\n\n构建缓存也会受益于这种关系。修改一个源文件时，依赖它的步骤需要重新执行；与它无关的步骤可以继续复用。AI 生成代码后，系统可以更快地做局部重建和局部测试。\n\n## 它解决的是完整性和变化检测\n\nMerkle DAG 不会自动告诉你某个版本好不好，也不会阻止拥有权限的人发布恶意版本。它能回答的是：“我拿到的内容是否与这个指纹对应？”以及“这个大对象依赖的哪一部分发生了变化？”\n\n## 一个生活化类比\n\n把一份报告分成章节，每章有自己的指纹，整本报告再用所有章节指纹生成总指纹。只改一章，就能定位总指纹变化来自哪里；如果下载到的章节指纹不匹配，就说明内容在传输或存储过程中变了。\n\n当 AI 工具讨论对象哈希、构建缓存、容器层或版本对象时，可以用 Merkle DAG 这张图来理解它们为什么能快速判断变化。参考资料见 [OCI Content Descriptors](https:\u002F\u002Fgithub.com\u002Fopencontainers\u002Fimage-spec\u002Fblob\u002Fmain\u002Fdescriptor.md)。","\u002Fuploads\u002F2026-09-14\u002Fceb258af-0b29-4f6c-92b0-c76eed116983.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},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse","官方资料","Open Container Initiative","https:\u002F\u002Fgithub.com\u002Fopencontainers\u002Fimage-spec\u002Fblob\u002Fmain\u002Fdescriptor.md","published","Merkle DAG 是什么？代码版本和缓存如何快速判断变化","用文件指纹和依赖关系理解 Merkle DAG，以及它在 AI 编程、Git 和容器中的作用。",null,false,46,0,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:42.258Z",[52,61,69],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":59,"createdAt":60},"7cc644a5-e0de-4d7b-802e-9e8b69677e12","AI 生成的代码会不会复制开源项目","ai-code-open-source-reference-license","AI 生成代码不等于天然没有来源。本文区分常见写法与高相似片段，解释代码引用、许可证、依赖供应链和轻量来源检查，帮助团队把合规当成代码质量的一部分。","\u002Fuploads\u002F2026-09-13\u002F920327ad-de7f-4caa-a2f4-816d467c9f9c.jpg",40,"2026-09-13T00:00:00.000Z","2026-09-13T11:55:49.911Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":67,"publishedAt":59,"createdAt":68},"1ff2b0c1-c125-4469-a09c-b8ddbc5bf705","AI 写 SQL 和数据库迁移，为什么必须人工确认","ai-generated-sql-database-migrations","数据库迁移会改变持久数据、锁和应用契约，语法正确不代表上线安全。本文解释 AI 生成 SQL 的风险，介绍扩展、迁移、收缩的兼容策略，以及生产执行前应检查的门槛。","\u002Fuploads\u002F2026-09-13\u002F6e5177d7-f51a-4722-951b-0108e9b7ecae.jpg",41,"2026-09-13T11:55:59.196Z",{"id":70,"type":6,"title":71,"slug":72,"summary":73,"coverUrl":74,"authorName":14,"sno":75,"publishedAt":49,"createdAt":76},"2d59f625-ead9-4cfd-b944-3d56bd9ea19a","AST：AI 为什么不只是在“读代码文本”？","ast-ai-code-understanding","AST 把源代码从一串文本变成一棵结构树，帮助编辑器、静态分析器和 AI 编程工具理解函数、变量、调用与分支之间的关系。","\u002Fuploads\u002F2026-09-14\u002F529ce69d-c781-4f61-9864-0294ae857718.jpg",42,"2026-09-14T15:01:25.949Z"]