본문 바로가기
C.W.K.
Stream
Lesson 02 of 04 · published

내용으로 계산하는 ID

~13 min · content-addressed, chunk-id, hashing, provenance

Level 0꺼진 심지
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"chunk에 이름을 붙이지 마. 그 chunk가 자기 내용으로 이름을 만들게 해."

id는 배정하지 않고 계산해

Lantern은 문서 내용의 해시와 chunk의 시작·끝 문자 위치, chunking profile id를 이어 붙여 SHA-256을 계산하고 앞의 16진수 32자를 chunk id로 사용해. 데이터베이스가 삽입 순서에 따라 붙인 표가 아니라, 내용과 그 내용을 자른 규칙에서 나온 지문이야.

공식에 들어가는 값마다 맡은 일이 있어

  • doc_sha256은 파일명이 아니라 바이트로 어느 문서인지 정해. 이름을 바꿔도 내용이 같으면 같은 문서고, 한 글자라도 고치면 다른 문서야.
  • char_startchar_end는 디코드된 문서에서 어느 범위를 가리키는지 고정해.
  • profile_id는 어떤 chunking 규칙으로 자른 결과인지 기록해. 같은 범위라도 다른 규칙으로 얻었다면 다른 chunk야.

삽입 시각이나 테이블 위치는 공식에 들어가지 않아. 저장한 장소와 시간을 빼야 어느 기계에서 다시 계산해도 같은 답을 얻을 수 있어.

한 공식에서 세 가지 성질이 따라와

같은 문서와 같은 범위, 같은 profile을 다시 수집하면 id도 같으니 재구축과 기계 이전을 견뎌. 동일한 내용은 같은 id로 모여 자연스럽게 중복이 줄고, 누구든 같은 값으로 id를 다시 계산해 기록이 맞는지 검증할 수 있어. Git이 blob과 commit을 내용으로 식별하고 컨테이너가 이미지 layer를 부르는 방식과 같은 생각이야.

해시를 32자로 줄이는 선택도 장단점을 따져 내린 결정이야. SHA-256 전체는 16진수 64자지만 절반만 남겨도 128비트 공간이야. 실제 개인 코퍼스에서 서로 다른 두 chunk가 같은 id를 얻을 가능성은 사실상 무시할 수 있을 만큼 작아. 이론적 여유 일부를 다루기 쉬운 주소와 바꾼 거지.

id만으로는 출처가 완성되지 않아

검색 결과에는 chunk id와 함께 코퍼스 id, 문서 경로, 문서 해시, 문자 위치, chunk 해시, profile이 따라다녀. id는 오래 가는 손잡이고 나머지 출처 정보는 원문을 다시 찾고 같은 범위를 잘라 검증하는 방법이야. 이 묶음이 있어야 몇 년 뒤 처음 검색할 때 존재하지도 않던 기계에서 해당 구절을 자신 있게 되살릴 수 있어.

Code

청크 ID는 배정표의 번호가 아니라 내용의 지문이야·python
import hashlib

def chunk_id(doc_sha256: str, char_start: int, char_end: int, profile_id: str) -> str:
    # Every input is a property of the CONTENT, never of insertion time or place.
    payload = f"{doc_sha256}:{char_start}:{char_end}:{profile_id}"
    return hashlib.sha256(payload.encode("utf-8")).hexdigest()[:32]

# Same content + same profile -> same id, forever, everywhere:
a = chunk_id("d41d8c...", 4120, 4229, "md-para-v1")
b = chunk_id("d41d8c...", 4120, 4229, "md-para-v1")
assert a == b            # deterministic

# Change the chunking rules -> a genuinely different chunk -> a different id:
c = chunk_id("d41d8c...", 4120, 4229, "md-para-v2")
assert c != a            # profile is part of identity

External links

Exercise

네 세계의 뭔가에 대한 내용 주소 ID를 설계해 — 사진, 노트, 레코드. 그걸 유일하게 식별해 주는 속성들을 나열해(언제 저장했는지나 어느 행에 저장됐는지 말고). 공식을 써: 어느 필드의 해시? 그다음 머릿속에서 테스트해 — 그 항목을 다른 기계로 복사하면, 네 공식이 같은 id를 낼까? 아니라면, 제거해야 할 위치나 시간 필드를 넣은 거야.
Hint
흔한 실수는 '혹시 모르니까' 타임스탬프나 파일명, 자동 증가 ID를 공식에 끼워 넣는 거야. 하나만 들어가도 이식성이 깨져. 내용 주소 ID는 오직 내용만으로 계산할 수 있어야 하고, 그래야 서로 독립된 두 기계도 같은 답을 내.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.