import { createHash } from 'node:crypto'; /** * 원장 문서 ID — 설계서 §3.3 「`txId = SHA-256(idempotencyKey)` 의 앞 20자」. * * 조건문으로 중복을 막지 않는 것이 핵심이다. 조회와 쓰기 사이에 동시 요청이 * 끼어들 수 있으므로, 문서 ID 충돌을 Firestore 가 원자적으로 판정하게 한다. */ export const txIdOf = (idempotencyKey: string): string => createHash('sha256').update(idempotencyKey).digest('hex').slice(0, 20); /** lot ID 는 원장과 1:1 로 묶어 대사 때 역추적할 수 있게 한다. */ export const lotIdOf = (txId: string): string => `lot_${txId}`; /** 단말 해시 — 어뷰징 판정 입력. 원값을 저장하지 않는다. */ export const deviceHashOf = (raw: string): string => createHash('sha256').update(raw).digest('hex').slice(0, 32); /** * 브리핑 중복 판정 키 — 같은 기사를 두 번 받아도 문서가 늘지 않게 한다. * * 수집기 재시도는 정상 경로다. 자동 생성 ID 를 쓰면 재시도마다 카드가 늘어나고 * 관리자가 같은 기사를 세 번 승인하게 된다. 암호 용도가 아니라 중복 판정이므로 * sha1 로 충분하고, 앞 12 자면 하루치 기사 수에서 충돌하지 않는다. */ export const briefingHashOf = (key: string): string => createHash('sha1').update(key).digest('hex').slice(0, 12);