Fingerprint コマンド
codeknit fingerprint コマンドは、Context-Triggered Piecewise Hashing (CTPH) を使用してコードベース全体の重複および近似重複コードを検出します。変数名、文字列リテラル、型注釈を正規化してから構造的なフィンガープリントを計算することで、ファイル間やプログラミング言語間でも機能します。
codeknit fingerprint は、コードベース内のすべての関数、メソッド、変数、型を分析し、以下に基づいて正規化された構造的フィンガープリントを計算します:
- 制御フロー(
if、for、while、switch) - 演算(
=、+、==、&&、||) - 呼び出し、戻り値、代入、オブジェクト生成
try/catch、yield、await、deferなどの言語構文
この正規化により、名前変更されたコピー&ペースト、些細なリファクタリング、および異なる言語での同等のロジックが重複として検出されます。
このアルゴリズムは CTPH(ローリングハッシュの一種)を使用して、近似重複を効率的に検出します。類似したコードは類似したフィンガープリントを生成し、コードがわずかに変更されていてもファジーマッチングが可能になります。
基本的な使用方法
Section titled “基本的な使用方法”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 埋め込みを使用して候補を再ランク付け(要件:ollama serve および ollama pull qwen3-embedding:0.6b) |
--model |
qwen3-embedding:0.6b |
--rerank で使用する Ollama 埋め込みモデル |
--collect-test |
false |
テストファイルを分析に含める |
--workers |
NumCPU |
最大同時解析ゴルーチン数(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>— 正規化された本文トークンストリーム
このセクションはデバッグや下流ツールの構築に役立ちます。
一般的なパターン
Section titled “一般的なパターン”# デフォルトスキャンcodeknit fingerprint /codeknit/ja/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つ未満の正規化トークンを持つシンボル(例:単純なゲッター)はノイズを避けるために無視されます。
- 言語間マッチングが機能する:同等の構造(例:Python 関数と同じロジックを持つ Go 関数)はマッチする可能性がありますが、言語固有のパターンが誤った低類似度マッチを生成することがあります。
- マッチはシグナルであり、判定ではない:各マッチを調査のきっかけとして扱い、自動的な重複の証明とはしないでください。