Skip to main content

Crate tiss_hash

Crate tiss_hash 

Source
Expand description

§tiss-hash

Hash MD5 do epílogo <ans:hash> em XMLs do Padrão TISS/ANS (Padrão TISS — Troca de Informações em Saúde Suplementar, regulamentado pela Agência Nacional de Saúde Suplementar).

Spec canônica: docs/SPEC.md no repositório principal. Implementação de referência: conformance/reference.py (Python + lxml). Esta crate bate byte-a-byte com a referência nos vetores em conformance/vectors.json (positivos comparam expected_md5; negativos exigem Err, ex.: múltiplos <ans:hash> e BOM UTF-16/UTF-32).

§Algoritmo (resumo)

  1. Parse do XML.
  2. Zerar o conteúdo de <ans:hash> (substituir por string vazia).
  3. Concatenar o .text de cada nó-folha (elemento ou comentário sem filhos elemento/comentário/PI), em ordem de documento.
  4. MD5 dos bytes UTF-8 da string concatenada (não ISO-8859-1, apesar do manual TISS).
  5. Hex lowercase, 32 caracteres.

Ver conformance/AMBIGUITY_NOTES.md para o catálogo das 15 decisões canônicas (CDATA, entidades, atributos, comentários, etc.).

§Quickstart

use tiss_hash::{hash_tiss, hash_tiss_file};

let raw = std::fs::read("envio.xml").unwrap();
let digest = hash_tiss(&raw).unwrap();
println!("{digest}"); // 32 chars hex lowercase

// ou direto do arquivo
let digest = hash_tiss_file("envio.xml").unwrap();

§Decisão de parser: roxmltree

Avaliadas três opções:

  • roxmltree (escolhida) — parser DOM puro, API próxima do ElementTree/lxml do Python. Suporta iteração descendants() que inclui nós Comment (semântica idêntica à lxml.iter() da referência). Zero alloc além da árvore. Limitação: aceita só &str UTF-8, exige pré-decodificação ISO-8859-1 manual (feita aqui — mapping 1:1 byte → codepoint).
  • quick-xml — SAX/streaming, mais rápido em throughput, mas exige reconstruir manualmente o conceito de “folha” e tracking de pilha. Descartado por não ser necessário pra performance esperada (XMLs TISS geralmente < 5 MB).
  • xmltree — DOM básico, menos manutenção, sem descendants() ergonômico. Descartado.

Enums§

TissHashError
Erros possíveis no cálculo do hash TISS.

Constants§

TISS_NAMESPACE
Namespace XML do Padrão TISS/ANS. Usado para localizar <ans:hash>.

Functions§

hash_tiss
Calcula o hash MD5 canônico do epílogo TISS/ANS a partir dos bytes do XML.
hash_tiss_file
Atalho: lê o arquivo do disco e calcula hash_tiss.