跳转到内容

Fingerprint 命令

codeknit fingerprint 命令使用 上下文触发分段哈希(CTPH) 在代码库中检测重复和近似重复代码。它通过在计算结构指纹前规范化变量名、字符串字面量和类型注解,实现跨文件甚至跨编程语言的检测。

codeknit fingerprint 分析代码库中的每个函数、方法、变量和类型,并基于以下内容计算 规范化结构指纹

  • 控制流(ifforwhileswitch
  • 操作(=+==&&||
  • 调用、返回、赋值和对象创建
  • 语言结构(如 try/catchyieldawaitdefer

这种规范化意味着 重命名的复制粘贴简单重构 以及 不同语言中的等效逻辑 仍然可以被检测为重复。

该算法使用 CTPH(一种滚动哈希变体)高效查找近似重复。相似的代码会产生相似的指纹,即使代码经过轻微修改也能实现模糊匹配。

Terminal window
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 serveollama pull qwen3-embedding:0.6b
--model qwen3-embedding:0.6b --rerank 配合使用的 Ollama 嵌入模型
--collect-test false 分析中包含测试文件
--workers NumCPU 最大并发解析 goroutine 数量(0 = 使用所有 CPU 核心)
--verbose false 处理过程中打印进度信息

输出为 .skt 文件,包含以下部分:

列出相似度超过阈值的符号对:

[duplicates]
similarity:96% pkg/user.go::GetUser <-> pkg/admin.go::GetAdmin
similarity: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> — 规范化的主体标记流

该部分适用于调试或构建下游工具。

Terminal window
# 默认扫描
codeknit fingerprint ./codeknit/de/src
Terminal window
# 查找完全重复
codeknit fingerprint ./src --min-similarity 100
Terminal window
# 查找中等相似度的代码(例如相同算法,不同名称)
codeknit fingerprint ./src --min-similarity 50 --max-similarity 80
Terminal window
# 使用语义重新排序减少误报
# 要求:ollama serve && ollama pull qwen3-embedding:0.6b
codeknit fingerprint ./src --rerank
Terminal window
# 使用不同的嵌入模型进行重新排序
codeknit fingerprint ./src --rerank --model qwen3-embedding:4b
Terminal window
# 输出完整指纹列表(用于分析工具)
codeknit fingerprint ./src --show-all
Terminal window
# 自定义输出文件
codeknit fingerprint ./src -o duplicates.skt
范围 指导建议
96–100% 完全或近乎完全的结构重复。几乎可以确定是复制粘贴。
85–95% 近似重复。通常是复制粘贴后经过微小编辑(例如重命名变量、添加日志)。
65–84% 默认范围。结构高度相似。适合重构的候选项。
50–64% 中等相似度。算法结构相同但细节不同。需手动审查。
< 50% 通常为噪声。无意义的重复。
  • 指纹衡量的是结构而非含义:高相似度得分意味着代码看起来相似,而非相同的事情。始终审查两个符号。
  • 对噪声结果使用 --rerank:如果出现大量误报,启用语义重新排序以使用嵌入过滤匹配。
  • 跳过短主体:规范化标记少于 4 个的符号(例如简单的 getter)会被忽略以避免噪声。
  • 支持跨语言匹配:等效结构(例如具有相同逻辑的 Python 函数和 Go 函数)可以匹配,但特定于语言的模式可能会产生低相似度的虚假匹配。
  • 匹配是信号而非结论:将每个匹配视为调查的提示,而非重复的自动证明。