ADR-0004:证据 ID 用内容哈希¶
- 状态:已采纳
- 日期:2026-09
背景¶
报告里的每条结论都要挂证据。证据 ID 可以自增、可以用来源 ID、也可以用内容哈希。
决策¶
evidence_id = "ev_" + sha1(normalize(url) + "|" + normalize(snippet))[:10]
normalize 去掉空白与中英文标点并转小写。
理由¶
- 跨源去重:同一条新闻从两个渠道抓到,id 相同,自动合并为一条,报告不会挂两遍;
- 跨运行稳定:重启、换机器、换数据库后引用仍然对得上——审计才有意义;
- 防篡改:改了证据内容,id 就变了,旧引用会失效而不是静默指向新内容。
代价¶
- 同一 URL 内容更新后会产生新 id(这正是想要的行为,但需要接受"证据数量增长");
- 哈希碰撞概率 1/2^40(取 10 位),对单次运行几百条证据来说足够。
配套的校验¶
审计不只看 id 是否存在,还要求 quote 归一化后能在 snippet 里找到——否则就是"看起来有引用"。
同时检查 published_at <= as_of,防止把未来才知道的消息喂给模型(前视偏差)。