Communitygithub.com

padrão-de-cache-por-hash-de-conteúdo

Armazena em cache resultados caros de processamento de arquivos usando hashes SHA-256 do conteúdo — independente de caminho, com invalidação automática e separação da camada de serviço. Use quando o processamento repetido de arquivos for lento e os resultados precisarem ser armazenados em cache e invalidados pelo conteúdo, não pelo caminho.

O que é padrão-de-cache-por-hash-de-conteúdo?

Este padrão fornece uma estratégia robusta de cache para processamento de arquivos computacionalmente caro (como parsing de PDF, extração de texto e análise de imagem) usando hashes SHA-256 do conteúdo do arquivo como chaves de cache. Diferente de estratégias baseadas em caminho, ele sobrevive a movimentações e renomeações de arquivos, invalidando automaticamente o cache sempre que o conteúdo do arquivo muda. O padrão é ideal para pipelines de processamento de arquivos, ferramentas CLI com opções `--cache/--no-cache` e cenários de processamento em lote onde os mesmos arquivos são processados repetidamente. Ele promove a separação de responsabilidades (SRP) ao manter as funções de processamento puras e adicionar o cache como uma camada de serviço separada, com armazenamento em arquivos `{hash}.json` para consultas O(1) sem necessidade de arquivo de índice. O padrão também define práticas recomendadas, como hashing em chunks para arquivos grandes, tratamento de corrupção de cache como perda de cache (nunca travando) e uso de serialização JSON manual para dataclasses congeladas aninhadas.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/content-hash-cache-pattern

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Padrão de Cache por Hash de Conteúdo de Arquivo

Armazene em cache resultados caros de processamento de arquivos (parsing de PDF, extração de texto, análise de imagem) usando hashes SHA-256 do conteúdo como chaves de cache. Diferente do cache baseado em caminho, esta abordagem sobrevive a movimentações/renomeações de arquivos e invalida automaticamente quando o conteúdo muda.

Quando Ativar

  • Construindo pipelines de processamento de arquivos (PDF, imagens, extração de texto)
  • O custo de processamento é alto e os mesmos arquivos são processados repetidamente
  • Necessidade de uma opção CLI --cache/--no-cache
  • Deseja adicionar cache a funções puras existentes sem modificá-las

Padrão Central

1. Chave de Cache Baseada em Hash de Conteúdo

Use o conteúdo do arquivo (não o caminho) como chave de cache:

import hashlib
from pathlib import Path

_TAMANHO_CHUNK_HASH = 65536  # 64KB chunks para arquivos grandes

def computar_hash_arquivo(caminho: Path) -> str:
    """SHA-256 do conteúdo do arquivo (em chunks para arquivos grandes)."""
    if not caminho.is_file():
        raise FileNotFoundError(f"Arquivo não encontrado: {caminho}")
    sha256 = hashlib.sha256()
    with open(caminho, "rb") as f:
        while True:
            chunk = f.read(_TAMANHO_CHUNK_HASH)
            if not chunk:
                break
            sha256.update(chunk)
    return sha256.hexdigest()

Por que hash de conteúdo? Renomear/mover arquivo = acerto de cache. Mudança de conteúdo = invalidação automática. Nenhum arquivo de índice necessário.

2. Dataclass Congelada para Entrada de Cache

from dataclasses import dataclass

@dataclass(frozen=True, slots=True)
class EntradaCache:
    hash_arquivo: str
    caminho_origem: str
    documento: DocumentoExtraido  # O resultado em cache

3. Armazenamento de Cache Baseado em Arquivo

Cada entrada de cache é armazenada como {hash}.json — consulta O(1) por hash, sem necessidade de arquivo de índice.

import json
from typing import Any

def escrever_cache(dir_cache: Path, entrada: EntradaCache) -> None:
    dir_cache.mkdir(parents=True, exist_ok=True)
    arquivo_cache = dir_cache / f"{entrada.hash_arquivo}.json"
    dados = serializar_entrada(entrada)
    arquivo_cache.write_text(json.dumps(dados, ensure_ascii=False), encoding="utf-8")

def ler_cache(dir_cache: Path, hash_arquivo: str) -> EntradaCache | None:
    arquivo_cache = dir_cache / f"{hash_arquivo}.json"
    if not arquivo_cache.is_file():
        return None
    try:
        raw = arquivo_cache.read_text(encoding="utf-8")
        dados = json.loads(raw)
        return desserializar_entrada(dados)
    except (json.JSONDecodeError, ValueError, KeyError):
        return None  # Trata corrupção como perda de cache

4. Invólucro de Camada de Serviço (SRP)

Mantenha a função de processamento pura. Adicione cache como uma camada de serviço separada.

def extrair_com_cache(
    caminho_arquivo: Path,
    *,
    cache_ativado: bool = True,
    dir_cache: Path = Path(".cache"),
) -> DocumentoExtraido:
    """Camada de serviço: verificação de cache -> extração -> escrita no cache."""
    if not cache_ativado:
        return extrair_texto(caminho_arquivo)  # Função pura, sem conhecimento de cache

    hash_arquivo = computar_hash_arquivo(caminho_arquivo)

    # Verificar cache
    cacheado = ler_cache(dir_cache, hash_arquivo)
    if cacheado is not None:
        logger.info("Acerto de cache: %s (hash=%s)", caminho_arquivo.name, hash_arquivo[:12])
        return cacheado.documento

    # Perda de cache -> extrair -> armazenar
    logger.info("Perda de cache: %s (hash=%s)", caminho_arquivo.name, hash_arquivo[:12])
    doc = extrair_texto(caminho_arquivo)
    entrada = EntradaCache(hash_arquivo=hash_arquivo, caminho_origem=str(caminho_arquivo), documento=doc)
    escrever_cache(dir_cache, entrada)
    return doc

Decisões de Design Principais

DecisãoJustificativa
Hash SHA-256 do conteúdoIndependente de caminho, invalida automaticamente na mudança de conteúdo
Nomeação de arquivo {hash}.jsonConsulta O(1), sem necessidade de arquivo de índice
Invólucro de camada de serviçoSRP: extração permanece pura, cache é uma preocupação separada
Serialização JSON manualControle total sobre serialização de dataclass congelada
Corrupção retorna NoneDegradação graciosa, reprocessa na próxima execução
dir_cache.mkdir(parents=True)Criação preguiçosa de diretório na primeira escrita

Melhores Práticas

  • Faça hash do conteúdo, não dos caminhos — caminhos mudam, a identidade do conteúdo não
  • Processe arquivos grandes em chunks ao fazer hash — evite carregar arquivos inteiros na memória
  • Mantenha funções de processamento puras — elas não devem saber nada sobre cache
  • Registre acertos/perdas de cache com hashes truncados para depuração
  • Lide com corrupção graciosamente — trate entradas de cache inválidas como perdas, nunca trave

Anti-Padrões a Evitar

# RUIM: Cache baseado em caminho (quebra ao mover/renomear arquivo)
cache = {"/caminho/para/arquivo.pdf": resultado}

# RUIM: Adicionar lógica de cache dentro da função de processamento (violação SRP)
def extrair_texto(caminho, *, cache_ativado=False, dir_cache=None):
    if cache_ativado:  # Agora esta função tem duas responsabilidades
        ...

# RUIM: Usar dataclasses.asdict() com dataclasses congeladas aninhadas
# (pode causar problemas com tipos aninhados complexos)
dados = dataclasses.asdict(entrada)  # Use serialização manual em vez disso

Quando Usar

  • Pipelines de processamento de arquivos (parsing de PDF, OCR, extração de texto, análise de imagem)
  • Ferramentas CLI que se beneficiam de opções --cache/--no-cache
  • Processamento em lote onde os mesmos arquivos aparecem em execuções diferentes
  • Adicionar cache a funções puras existentes sem modificá-las

Quando NÃO Usar

  • Dados que devem estar sempre frescos (alimentações em tempo real)
  • Entradas de cache que seriam extremamente grandes (considere streaming)
  • Resultados que dependem de parâmetros além do conteúdo do arquivo (ex.: diferentes configurações de extração)

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Habilidades Relacionadas