HanBase256
Compact for copy/paste. Typable in a pinch.
Hexadecimal mixes letters and numbers, making it hard to type. In Korean, 2 and e both sound like “이(yi)”.
Base64/85 are compact, but awkward to type.
BIP39 uses readable words, but gets long.
SHA-256: 64 Hexadecimal digits → 32 Hangul syllables. Checksum optional.
Online converter
Text → SHA-256 → compare representations.
Byte mapping
One byte, one syllable. Use this table in your own code.
Hexadecimal row + column: F0 + 01 = F1. Scroll sideways to see all columns.
| HEX | +00 | +01 | +02 | +03 | +04 | +05 | +06 | +07 | +08 | +09 | +0A | +0B | +0C | +0D | +0E | +0F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | 가 | 갈 | 감 | 강 | 개 | 거 | 건 | 검 | 결 | 경 | 고 | 곡 | 골 | 곰 | 공 | 과 |
| 10 | 관 | 광 | 교 | 구 | 국 | 군 | 굴 | 권 | 귀 | 그 | 극 | 근 | 금 | 기 | 길 | 김 |
| 20 | 나 | 난 | 남 | 내 | 너 | 노 | 농 | 누 | 니 | 다 | 단 | 달 | 당 | 대 | 더 | 덕 |
| 30 | 도 | 돈 | 돌 | 동 | 두 | 드 | 들 | 등 | 디 | 라 | 란 | 러 | 레 | 력 | 로 | 론 |
| 40 | 루 | 리 | 린 | 마 | 만 | 말 | 망 | 매 | 머 | 면 | 명 | 모 | 목 | 무 | 문 | 물 |
| 50 | 미 | 민 | 밀 | 바 | 반 | 발 | 방 | 배 | 백 | 버 | 번 | 벌 | 범 | 변 | 병 | 보 |
| 60 | 봄 | 봉 | 부 | 북 | 분 | 불 | 비 | 빈 | 사 | 산 | 살 | 삼 | 상 | 색 | 생 | 서 |
| 70 | 석 | 선 | 설 | 섬 | 성 | 세 | 소 | 속 | 손 | 솔 | 송 | 수 | 순 | 술 | 스 | 승 |
| 80 | 시 | 식 | 신 | 실 | 심 | 아 | 악 | 안 | 알 | 암 | 야 | 약 | 양 | 어 | 언 | 엄 |
| 90 | 에 | 여 | 역 | 연 | 열 | 영 | 오 | 온 | 와 | 왕 | 외 | 요 | 용 | 우 | 운 | 울 |
| A0 | 원 | 월 | 위 | 유 | 육 | 윤 | 은 | 이 | 인 | 일 | 임 | 자 | 작 | 장 | 저 | 적 |
| B0 | 전 | 절 | 점 | 정 | 제 | 조 | 종 | 주 | 준 | 중 | 지 | 직 | 진 | 짐 | 차 | 참 |
| C0 | 창 | 처 | 천 | 철 | 청 | 체 | 초 | 촌 | 총 | 최 | 추 | 축 | 출 | 충 | 치 | 친 |
| D0 | 침 | 카 | 칼 | 커 | 코 | 쿠 | 크 | 키 | 타 | 탄 | 탈 | 태 | 터 | 토 | 통 | 투 |
| E0 | 트 | 티 | 파 | 판 | 팔 | 퍼 | 편 | 평 | 표 | 푸 | 풍 | 피 | 필 | 하 | 학 | 한 |
| F0 | 항 | 해 | 행 | 향 | 허 | 현 | 형 | 호 | 혼 | 홍 | 화 | 환 | 황 | 회 | 후 | 히 |
Standard libraries
Python and JavaScript with the standard mapping and checksum.
Code examples
import hashlib
import hanbase256
digest = hashlib.sha256(
b"The quick brown fox jumps over the lazy dog"
).digest()
encoded = hanbase256.encode_with_checksum(digest)
# Recover the original hash.
assert hanbase256.decode_with_checksum(encoded) == digest
print(hanbase256.decode_with_checksum(encoded).hex())
import { encodeWithChecksum, decodeWithChecksum,
sha256, toHex }
from './hanbase256.mjs';
const bytes = new TextEncoder().encode(
'The quick brown fox jumps over the lazy dog'
);
const digest = await sha256(bytes);
const encoded = await encodeWithChecksum(digest);
// Recover the original hash.
const recovered = await decodeWithChecksum(encoded);
console.log(toHex(recovered));
FAQ
Who is it for?
For Korean readers. Use it mainly for copy/paste, and type it when needed.
Why 256 syllables?
English has 26 letters. Hangul has 11,172 modern syllables. We use 256 familiar ones. 256 = 2⁸, so each syllable holds one byte. Unicode ↗
How does it compare to Hexadecimal and Base64/85?
Base64/85 prioritize compact text. HanBase256 balances length and typability for Korean readers. One syllable represents one byte. Base16 / Base64 ↗
How does it compare to BIP39?
BIP39 represents 256 bits with 24 words. HanBase256 uses 32 syllables, with an optional checksum. BIP39 ↗
What does the converter do?
Encoder hashes your text and compares formats. Decoder recovers the SHA-256 hash, not the original text.
Is it encryption or compression?
Neither. It changes how a hash is written. 32 syllables use 96 UTF-8 bytes. The checksum is extra. Base64 is not compression either.
What is +checksum?
The extra syllable helps catch errors. Decoding accepts 32 syllables without it. If a checksum is present, it is verified. A wrong checksum shows an error.