Pular para o conteúdo
Skillpedia
Automações280 mil · #28

content-hash-cache-pattern

Faz seu agente usar hashes de conteúdo para cachear resultados de processamento de arquivos. Isso evita processamento repetido e invalida o cache automaticamente quando o conteúdo muda. Útil para acelerar tarefas lentas.

O que ela faz

Este padrão ajuda a acelerar o processamento de arquivos repetitivos, como extrair texto de PDFs ou analisar imagens. Ele salva os resultados em um 'cache' (uma memória rápida) usando um código único gerado a partir do conteúdo do arquivo. Se o arquivo não mudar, o resultado é recuperado rapidamente do cache.

Quando usar

  • ✓Quando você processa os mesmos arquivos várias vezes e isso demora muito.
  • ✓Ao criar sistemas que lidam com muitos arquivos, como PDFs ou imagens.
  • ✓Quando você quer que o cache funcione mesmo se os arquivos forem movidos ou renomeados.

Exemplo do que pedir para a IA

“Posso usar o cache para acelerar a extração de texto deste relatório PDF?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/content-hash-cache-pattern/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/content-hash-cache-pattern/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele calcula um código único (hash) baseado no conteúdo exato do arquivo. Esse código é usado para encontrar o resultado salvo em um arquivo de cache. Se o conteúdo do arquivo mudar, um novo código é gerado e o resultado antigo é ignorado.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill content-hash-cache-pattern

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/content-hash-cache-pattern/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

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

Armazene em cache os resultados de processamento de arquivos caros (análise de PDF, extração de texto, análise de imagem) usando hashes de conteúdo SHA-256 como chaves de cache. Diferente do cache baseado em caminho, essa 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
  • Precisa de uma opção de linha de comando --cache/--no-cache
  • Quer 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

_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()

Por que hash de conteúdo? Renomear/mover arquivo = cache hit. 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 CacheEntry:
    file_hash: str
    source_path: str
    document: ExtractedDocument  # The cached result

3. Armazenamento de Cache Baseado em Arquivo

Cada entrada de cache é armazenada como {hash}.json — busca O(1) por hash, nenhum arquivo de índice é necessário.

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. Wrapper de Camada de Serviço (SRP)

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

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

Principais Decisões de Design

Decisão Racional
Hash de conteúdo SHA-256 Independente de caminho, invalida automaticamente em mudança de conteúdo
Nomeação de arquivo {hash}.json Busca O(1), nenhum arquivo de índice necessário
Wrapper de camada de serviço SRP: extração permanece pura, cache é uma preocupação separada
Serialização JSON manual Controle total sobre a serialização de dataclass congelada
Retorno de corrupção None Degradação graciosa, reprocessa na próxima execução
cache_dir.mkdir(parents=True) Criação preguiçosa de diretório na primeira escrita

Melhores Práticas

  • Hasheie o conteúdo, não os caminhos — caminhos mudam, identidade do conteúdo não
  • Divida arquivos grandes em pedaços ao hashear — evite carregar arquivos inteiros na memória
  • Mantenha as funções de processamento puras — elas não devem saber nada sobre cache
  • Registre cache hit/miss com hashes truncados para depuração
  • Lide com corrupção graciosamente — trate entradas de cache inválidas como misses, nunca trave

Antí-Padrões a Evitar

# RUIM: Cache baseado em caminho (quebra em movimentação/renomeação de arquivo)
cache = {"/path/to/file.pdf": result}


…
Perguntas frequentes

Por que usar o conteúdo do arquivo e não o nome dele?

Porque o nome do arquivo pode mudar (ser renomeado ou movido), mas o conteúdo pode ser o mesmo. Usar o conteúdo garante que o cache funcione corretamente mesmo nessas situações.

O que acontece se o conteúdo do arquivo mudar?

Um novo código único (hash) é gerado para o novo conteúdo. O sistema então percebe que o resultado antigo no cache não é mais válido e processa o arquivo novamente para criar um novo resultado cacheado.

Onde os resultados são salvos?

Os resultados são salvos em arquivos separados, nomeados com o código único (hash) do conteúdo. Isso permite que o sistema encontre rapidamente o resultado correto sem precisar de uma lista separada.

Detalhes

Descrição original do autor

Cache expensive file processing results using SHA-256 content hashes — path-independent, auto-invalidating, with service layer separation. Use when repeated file processing is slow and results should be cached and invalidated by content rather than path.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#28
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas