content-hash-cache-pattern
ファイルの内容をSHA-256でハッシュ化し、パスに依存しない形で処理結果をキャッシュするパターンです。内容が変われば自動的に無効化され、サービス層を分離したクリーンな設計を実現します。コストの高いファイル処理を効率化したい場面で活躍します。
description の原文を見る
使用SHA-256内容哈希缓存昂贵的文件处理结果——路径无关、自动失效、服务层分离。
SKILL.md 本文
コンテンツハッシュファイルキャッシュパターン
SHA-256 コンテンツハッシュをキャッシュキーとして使用し、高コストなファイル処理結果(PDF 解析、テキスト抽出、画像分析)をキャッシュします。パスベースのキャッシュとは異なり、この方法はファイルの移動/名前変更後も有効であり、コンテンツ変更時には自動的に無効化されます。
いつ活用するか
- ファイル処理パイプラインを構築するとき(PDF、画像、テキスト抽出)
- 処理コストが高く、同じファイルが繰り返し処理されるとき
--cache/--no-cacheCLI オプションが必要なとき- 既存の純粋関数を変更せずにキャッシュを追加したいとき
コアパターン
1. コンテンツハッシュベースのキャッシュキー
ファイルパスではなくファイルコンテンツをキャッシュキーとして使用します:
import hashlib
from pathlib import Path
_HASH_CHUNK_SIZE = 65536 # 64KB chunks for large files
def compute_file_hash(path: Path) -> str:
"""SHA-256 of file contents (chunked for large files)."""
if not path.is_file():
raise FileNotFoundError(f"File not found: {path}")
sha256 = hashlib.sha256()
with open(path, "rb") as f:
while True:
chunk = f.read(_HASH_CHUNK_SIZE)
if not chunk:
break
sha256.update(chunk)
return sha256.hexdigest()
コンテンツハッシュを使う理由は? ファイルの名前変更/移動 = キャッシュヒット。コンテンツ変更 = 自動無効化。インデックスファイルが不要。
2. キャッシュエントリ用のフローズンデータクラス
from dataclasses import dataclass
@dataclass(frozen=True, slots=True)
class CacheEntry:
file_hash: str
source_path: str
document: ExtractedDocument # The cached result
3. ファイルベースのキャッシュストレージ
各キャッシュエントリは {hash}.json として保存——ハッシュで O(1) ルックアップを実現し、インデックスファイルは不要です。
import json
from typing import Any
def write_cache(cache_dir: Path, entry: CacheEntry) -> None:
cache_dir.mkdir(parents=True, exist_ok=True)
cache_file = cache_dir / f"{entry.file_hash}.json"
data = serialize_entry(entry)
cache_file.write_text(json.dumps(data, ensure_ascii=False), encoding="utf-8")
def read_cache(cache_dir: Path, file_hash: str) -> CacheEntry | None:
cache_file = cache_dir / f"{file_hash}.json"
if not cache_file.is_file():
return None
try:
raw = cache_file.read_text(encoding="utf-8")
data = json.loads(raw)
return deserialize_entry(data)
except (json.JSONDecodeError, ValueError, KeyError):
return None # Treat corruption as cache miss
4. サービスレイヤーラッパー(単一責任の原則)
処理関数の純粋性を保ちます。キャッシュを独立したサービスレイヤーとして追加します。
def extract_with_cache(
file_path: Path,
*,
cache_enabled: bool = True,
cache_dir: Path = Path(".cache"),
) -> ExtractedDocument:
"""Service layer: cache check -> extraction -> cache write."""
if not cache_enabled:
return extract_text(file_path) # Pure function, no cache knowledge
file_hash = compute_file_hash(file_path)
# Check cache
cached = read_cache(cache_dir, file_hash)
if cached is not None:
logger.info("Cache hit: %s (hash=%s)", file_path.name, file_hash[:12])
return cached.document
# Cache miss -> extract -> store
logger.info("Cache miss: %s (hash=%s)", file_path.name, file_hash[:12])
doc = extract_text(file_path)
entry = CacheEntry(file_hash=file_hash, source_path=str(file_path), document=doc)
write_cache(cache_dir, entry)
return doc
主要な設計決定
| 決定 | 理由 |
|---|---|
| SHA-256 コンテンツハッシュ | パス非依存、コンテンツ変更時に自動無効化 |
{hash}.json ファイル命名 | O(1) ルックアップ、インデックスファイル不要 |
| サービスレイヤーラッパー | 単一責任の原則:抽出機能は純粋、キャッシュは独立した関心事 |
| 手動 JSON シリアライズ | フローズンデータクラスのシリアライズを完全制御 |
破損時に None を返す | 優雅に劣化、次回の実行時に再処理 |
cache_dir.mkdir(parents=True) | 初回書き込み時にディレクトリを遅延作成 |
ベストプラクティス
- パスではなくコンテンツをハッシュ化する —— パスは変わるが、コンテンツ識別子は変わらない
- 大ファイルをハッシュする際はチャンク単位で処理 —— ファイル全体をメモリに読み込まない
- 処理関数の純粋性を保つ —— キャッシュについて何も知らないようにする
- キャッシュヒット/ミスをログに記録し、デバッグ用に切り詰めたハッシュ値を使用する
- 破損への対応は優雅に —— 無効なキャッシュエントリをミスとして扱い、決してクラッシュしない
避けるべきアンチパターン
# BAD: Path-based caching (breaks on file move/rename)
cache = {"/path/to/file.pdf": result}
# BAD: Adding cache logic inside the processing function (SRP violation)
def extract_text(path, *, cache_enabled=False, cache_dir=None):
if cache_enabled: # Now this function has two responsibilities
...
# BAD: Using dataclasses.asdict() with nested frozen dataclasses
# (can cause issues with complex nested types)
data = dataclasses.asdict(entry) # Use manual serialization instead
適用シーン
- ファイル処理パイプライン(PDF 解析、OCR、テキスト抽出、画像分析)
--cache/--no-cacheオプションで利益を得る CLI ツール- 複数回の実行で同じファイルが出現するバッチ処理
- 既存の純粋関数を変更せずにキャッシュを追加したい場合
非適用シーン
- 常に最新状態を保つ必要があるデータ(リアルタイムデータストリーム)
- キャッシュエントリが非常に大きくなる可能性がある場合(ストリーミング処理の検討が必要)
- 結果がファイルコンテンツ以外のパラメータに依存する場合(例:異なる抽出設定)
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- affaan-m
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/affaan-m/everything-claude-code / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。