Fingerprint 命令
codeknit fingerprint 命令使用 上下文触发分段哈希(CTPH) 在代码库中检测重复和近似重复代码。它通过在计算结构指纹前规范化变量名、字符串字面量和类型注解,实现跨文件甚至跨编程语言的检测。
codeknit fingerprint 分析代码库中的每个函数、方法、变量和类型,并基于以下内容计算 规范化结构指纹:
- 控制流(
if、for、while、switch) - 操作(
=、+、==、&&、||) - 调用、返回、赋值和对象创建
- 语言结构(如
try/catch、yield、await、defer)
这种规范化意味着 重命名的复制粘贴、简单重构 以及 不同语言中的等效逻辑 仍然可以被检测为重复。
该算法使用 CTPH(一种滚动哈希变体)高效查找近似重复。相似的代码会产生相似的指纹,即使代码经过轻微修改也能实现模糊匹配。
codeknit fingerprint ./src该命令将:
- 解析
./src中的所有源文件 - 计算结构指纹
- 将结果输出到
./skeleton/fingerprints.skt - 报告相似度在 65% 到 95% 之间的匹配(默认范围)
| 参数 | 默认值 | 描述 |
|---|---|---|
-o, --output |
./skeleton/fingerprints.skt |
输出 .skt 文件路径 |
--min-similarity |
65 |
报告的最低相似度百分比(0–100) |
--max-similarity |
95 |
报告的最高相似度百分比(0–100) |
--show-all |
false |
包含 [fingerprints] 部分,其中包含原始标记数据 |
--rerank |
false |
使用 Ollama 的语义嵌入重新排序 CTPH 候选项,以消除误报(要求:ollama serve 和 ollama pull qwen3-embedding:0.6b) |
--model |
qwen3-embedding:0.6b |
与 --rerank 配合使用的 Ollama 嵌入模型 |
--collect-test |
false |
分析中包含测试文件 |
--workers |
NumCPU |
最大并发解析 goroutine 数量(0 = 使用所有 CPU 核心) |
--verbose |
false |
处理过程中打印进度信息 |
输出为 .skt 文件,包含以下部分:
[duplicates](始终存在)
Section titled “[duplicates](始终存在)”列出相似度超过阈值的符号对:
[duplicates]similarity:96% pkg/user.go::GetUser <-> pkg/admin.go::GetAdminsimilarity:88% utils/str.go::TrimSpaces <-> lib/text.go::CleanString每行显示:
- 相似度百分比
- 左侧符号(文件路径、作用域、名称)
- 右侧符号(文件路径、作用域、名称)
[fingerprints](仅在 --show-all 时出现)
Section titled “[fingerprints](仅在 --show-all 时出现)”包含每个符号的原始指纹数据:
[fingerprints]validateToken FP:3:a1b2c3...:d4e5f6... tokens:8e0f1a2b...字段:
- 符号名称
FP:<version>:<hash1>:<hash2>— CTPH 指纹tokens:<hex>— 规范化的主体标记流
该部分适用于调试或构建下游工具。
# 默认扫描codeknit fingerprint ./codeknit/de/src# 查找完全重复codeknit fingerprint ./src --min-similarity 100# 查找中等相似度的代码(例如相同算法,不同名称)codeknit fingerprint ./src --min-similarity 50 --max-similarity 80# 使用语义重新排序减少误报# 要求:ollama serve && ollama pull qwen3-embedding:0.6bcodeknit fingerprint ./src --rerank# 使用不同的嵌入模型进行重新排序codeknit fingerprint ./src --rerank --model qwen3-embedding:4b# 输出完整指纹列表(用于分析工具)codeknit fingerprint ./src --show-all# 自定义输出文件codeknit fingerprint ./src -o duplicates.skt选择相似度范围
Section titled “选择相似度范围”| 范围 | 指导建议 |
|---|---|
| 96–100% | 完全或近乎完全的结构重复。几乎可以确定是复制粘贴。 |
| 85–95% | 近似重复。通常是复制粘贴后经过微小编辑(例如重命名变量、添加日志)。 |
| 65–84% | 默认范围。结构高度相似。适合重构的候选项。 |
| 50–64% | 中等相似度。算法结构相同但细节不同。需手动审查。 |
| < 50% | 通常为噪声。无意义的重复。 |
- 指纹衡量的是结构而非含义:高相似度得分意味着代码看起来相似,而非做相同的事情。始终审查两个符号。
- 对噪声结果使用
--rerank:如果出现大量误报,启用语义重新排序以使用嵌入过滤匹配。 - 跳过短主体:规范化标记少于 4 个的符号(例如简单的 getter)会被忽略以避免噪声。
- 支持跨语言匹配:等效结构(例如具有相同逻辑的 Python 函数和 Go 函数)可以匹配,但特定于语言的模式可能会产生低相似度的虚假匹配。
- 匹配是信号而非结论:将每个匹配视为调查的提示,而非重复的自动证明。