앱갈피

해밍 거리 계산기

Hamming distance — 같은 길이의 두 값에서 다른 자리 수

자동 감지됨 · 직접 바꿀 수 있어요 · 1자리 = 비트

비트열 A

0자리

비트열 B

0자리

2진 모드는 값을 그대로 비교합니다

예제

두 값을 입력하면 결과가 바로 나옵니다

광고

모든 계산은 브라우저에서 처리되며 서버로 전송되지 않습니다

관련 계산기

이 계산기는 무엇인가요

해밍 거리(Hamming distance)는 길이가 같은 두 값을 앞에서부터 한 자리씩 맞대어 보고, 서로 다른 자리가 몇 개인지 센 값입니다. 1950년 리처드 해밍이 오류 검출·정정 부호를 만들면서 정의했고, 지금은 통신 오류 검출, 해시 유사도 비교, DNA 서열 비교, 정보처리기사 같은 자격증 시험에서 두루 쓰입니다.

산식 자체는 한 줄입니다. 그런데 실제로 손으로 세다 보면 틀리는 곳은 산식이 아니라 다른 데 있습니다 — 다른 자리가 정확히 몇 번째인지, 눈에 똑같아 보이는 두 한글이 왜 전부 다르다고 나오는지, 16진 두 값의 거리가 4인지 1인지 같은 것들입니다. 이 계산기는 답 하나만 주지 않고 자리별 비교표와 XOR 검산까지 함께 보여 줍니다.

길이가 다르면 해밍 거리는 정의되지 않습니다. 그럴 때 이 계산기는 "길이가 다릅니다" 한 줄로 끝내는 대신 선행·후행 공백, 줄바꿈 문자, 눈에 보이지 않는 문자, 탭, 유니코드 정규화 형식 중 무엇이 원인인지 검사해서 알려 줍니다. 원인을 찾지 못하면 지어내지 않고 못 찾았다고 말합니다.

해밍 거리 예제 — 표준 검산표

AB해밍 거리다른 자리
1011101100100123번째, 5번째
101010100없음
0000111141·2·3·4번째
0001010022번째, 4번째
2173896223379632번째, 3번째, 5번째
karolinkathrin33번째, 4번째, 5번째
karolinkerstin32번째, 4번째, 5번째
kathrinkerstin42번째, 3번째, 4번째, 5번째
tonedroses31번째, 3번째, 5번째
ACGTACGTACGTAAGT16번째

두 값의 길이가 같아야 계산됩니다. 다른 자리 위치는 1번째부터 셉니다.

최소 해밍 거리와 오류 검출·정정 능력

최소 해밍 거리 dmin검출 능력 td정정 능력 tc
10개0개
21개0개
32개1개
43개1개
54개2개
65개2개
76개3개

자격증 시험에서 가장 자주 나오는 표입니다. dmin은 코드워드 집합 안의 모든 쌍 중 가장 작은 해밍 거리입니다.

해밍 거리 구하는 법 — 자리 비교 방식

가장 기본이 되는 방법입니다. 두 값을 세로로 나란히 놓고 같은 자리끼리 비교해서, 다른 자리의 개수를 셉니다.

예를 들어 1011101과 1001001을 비교하면 1번째는 1과 1로 같고, 2번째는 0과 0으로 같고, 3번째는 1과 0으로 다르고, 4번째는 1과 1로 같고, 5번째는 1과 0으로 다르고, 6번째와 7번째는 각각 같습니다. 다른 자리는 3번째와 5번째 두 개이므로 해밍 거리는 2입니다.

중요한 것은 두 값의 길이가 반드시 같아야 한다는 점입니다. 길이가 다르면 짝지을 자리가 없어서 해밍 거리 자체가 정의되지 않습니다. 길이가 다른 두 문자열을 비교하고 싶다면 아래에서 설명하는 편집 거리를 씁니다.

XOR과 popcount로 구하는 법 — 프로그래밍에서 쓰는 방식

두 비트열을 XOR(배타적 논리합)하면 같은 자리는 0, 다른 자리는 1이 됩니다. 그러면 결과에 들어 있는 1의 개수가 곧 해밍 거리입니다. 이 1의 개수를 세는 연산을 popcount(population count)라고 부릅니다.

앞의 예제로 확인해 보면 1011101 XOR 1001001 = 0010100이고, 여기 들어 있는 1은 3번째와 5번째 자리의 두 개입니다. 자리를 하나씩 세어 얻은 값과 정확히 같습니다. 이 계산기가 XOR 카드에 "XOR의 1 개수 = 해밍 거리"라는 줄을 함께 내는 이유가 이것입니다 — 답을 두 경로로 만들어 서로 검산하는 셈입니다.

C·C++의 __builtin_popcount, 자바의 Integer.bitCount, 파이썬의 bin(a ^ b).count("1") 같은 함수가 전부 이 방식입니다. 코딩 테스트에서 해밍 거리 문제가 나오면 대개 이 한 줄로 끝납니다.

다만 언어의 정수 타입으로 비트열 전체를 한 번에 바꾸려 들면 자릿수가 커질 때 조용히 틀립니다. 자바스크립트에서 1이 64개인 비트열을 parseInt로 16진수로 바꾸면 ffffffffffffffff가 아니라 10000000000000000이 나옵니다. 이 계산기는 그래서 정수 변환을 쓰지 않고 4비트씩 끊어서 변환합니다.

해밍 가중치 — 해밍 거리의 특수한 경우

해밍 가중치(Hamming weight)는 값 하나에 들어 있는 0이 아닌 자리의 개수입니다. 비트열이라면 1의 개수입니다. 1011101의 해밍 가중치는 5입니다.

해밍 가중치는 사실 해밍 거리의 특수한 경우입니다. 어떤 값과 0으로만 이뤄진 값(0000000) 사이의 해밍 거리가 곧 그 값의 해밍 가중치이기 때문입니다. 이 계산기는 2진·16진 모드에서 두 값의 해밍 가중치를 함께 표시합니다.

최소 해밍 거리와 오류 검출·정정 능력 (자격증 대비)

코드워드가 여러 개 있을 때, 모든 쌍의 해밍 거리 중 가장 작은 값을 최소 해밍 거리(dmin)라고 합니다. 부호의 성능을 결정하는 값이라 정보처리기사·정보통신기사 시험에 반복해서 나옵니다.

오류 검출 능력은 td ≤ dmin − 1로, 오류 정정 능력은 tc ≤ ⌊(dmin − 1)/2⌋로 씁니다. ⌊ ⌋는 소수점을 버리는 기호입니다. 예를 들어 dmin이 3이면 검출 능력은 2개, 정정 능력은 ⌊2/2⌋ = 1개입니다.

이 두 식이 직관적으로 이해되지 않을 때는 이렇게 생각하면 편합니다. 어떤 코드워드에서 비트가 dmin − 1개까지 바뀌어도 다른 정상 코드워드와 겹치지 않으므로 "뭔가 잘못됐다"는 사실은 알 수 있습니다. 하지만 "원래 무엇이었는지"까지 알아맞히려면 원래 코드워드 쪽이 다른 어떤 코드워드보다 확실히 가까워야 하므로 거리의 절반까지만 가능합니다.

(7,4) 해밍 부호는 dmin이 3이라 오류를 2개까지 검출하고 1개까지 정정합니다. 패리티 비트 하나만 붙인 단순 패리티 검사는 dmin이 2라 오류 1개를 검출할 수 있을 뿐 정정은 하지 못합니다.

해밍 거리와 편집 거리(레벤슈타인 거리)의 차이

두 문자열이 얼마나 다른지 재는 척도라는 점은 같지만, 허용하는 연산이 다릅니다. 해밍 거리는 치환만 셉니다. 편집 거리(레벤슈타인 거리)는 삽입·삭제·치환을 모두 셉니다.

그래서 해밍 거리는 길이가 같은 두 값에서만 정의되고, 편집 거리는 길이가 달라도 계산됩니다. 101과 1011의 해밍 거리는 정의되지 않지만 편집 거리는 1입니다(끝에 1을 하나 삽입).

길이가 같은 경우에도 두 값이 항상 일치하지는 않습니다. 다만 편집 거리는 해밍 거리보다 크지 않다는 관계는 항상 성립합니다 — 치환만 쓰는 방법도 편집 방법 중 하나이기 때문입니다.

어느 쪽을 써야 할지 헷갈린다면 기준은 간단합니다. 자리가 밀릴 수 있는 상황(오탈자, 문장 비교)이면 편집 거리, 자리가 고정된 상황(비트열, 고정 길이 코드, 해시)이면 해밍 거리입니다.

어디에 쓰나 — 실제 사용 사례

오류 검출·정정: 통신이나 저장 장치에서 비트가 뒤집혔는지 확인하고, 어느 비트가 뒤집혔는지 찾아 되돌립니다. 해밍 부호·CRC·ECC 메모리가 모두 이 개념 위에 있습니다.

해시 유사도: 지각 해시(pHash)나 SimHash처럼 "비슷한 입력은 비슷한 해시를 낸다"는 성질을 갖는 해시에서, 두 해시의 해밍 거리가 작으면 원본이 비슷하다고 봅니다. 이미지 중복 검출이나 문서 유사도 판정에 쓰입니다. 이 경우 비트 기준 거리가 필요하므로 16진 모드에서 비트 기준 값을 봐야 합니다.

생물정보학: 길이가 같은 DNA·단백질 서열에서 몇 개 위치가 다른지 세는 데 그대로 쓰입니다. ACGTACGT와 ACGTAAGT는 6번째 한 자리만 다르므로 해밍 거리가 1입니다.

코딩 테스트: 백준 3449번(해밍 거리)이나 LeetCode 461번(Hamming Distance)처럼 정의를 그대로 구현하는 문제가 자주 출제됩니다. 이 계산기는 개념 확인과 검산에 쓰시고, 문제 풀이 자체는 직접 하시길 권합니다.

한글·이모지에서 특히 조심할 것

텍스트 모드는 문자를 사용자가 눈으로 인지하는 단위(그래핌)로 셉니다. 그래서 👍는 1자, 가족 이모지 👨‍👩‍👧‍👦도 1자입니다. 프로그래밍 언어에서 흔히 쓰는 문자열 길이로 재면 각각 2와 11이 나오는데, 이 계산기는 그렇게 세지 않습니다.

더 조심해야 하는 것은 한글의 유니코드 정규화 형식입니다. "가족"은 완성형(NFC)으로도 자모 분리형(NFD)으로도 저장될 수 있고, 화면에서는 완전히 똑같이 보입니다. 그런데 정규화를 끄고 비교하면 두 글자가 전부 다르다고 나옵니다 — 해밍 거리 2입니다.

이 계산기는 NFC 정규화를 기본으로 켜 두고, 정규화를 끈 상태에서 두 값의 형식이 다르면 그 사실을 따로 경고합니다. 정규화가 적용된 경우에는 "NFC 정규화 적용됨"이라고 화면에 남깁니다 — 입력한 것과 다른 값이 계산됐다면 그 사실이 보여야 하기 때문입니다.

자주 묻는 질문

길이가 다른 두 값의 해밍 거리는 어떻게 구하나요?
구할 수 없습니다. 해밍 거리는 길이가 같은 두 값에서만 정의됩니다. 길이가 다르다면 편집 거리(레벤슈타인 거리)를 쓰셔야 합니다. 이 계산기는 길이가 다르면 계산을 거부하는 대신 공백·줄바꿈·보이지 않는 문자·정규화 형식 중 무엇이 원인인지 진단해 드리고, 편집 거리도 함께 보여 줍니다.
16진수 두 개의 해밍 거리가 4라고도 나오고 1이라고도 나오는데 뭐가 맞나요?
둘 다 맞습니다. 기준이 다를 뿐입니다. FF와 F0을 비교하면 16진 한 자리(니블) 기준으로는 마지막 한 자리만 다르므로 1이고, 비트로 펴서 보면 네 비트가 다르므로 4입니다. 해시 유사도를 재려면 비트 기준, 자릿수를 비교하려면 문자 기준입니다. 이 계산기는 둘 다 화면에 함께 보여 주기 때문에 어느 쪽을 기대하셨든 틀리지 않습니다.
해밍 거리와 최소 해밍 거리는 뭐가 다른가요?
해밍 거리는 두 값 사이의 값이고, 최소 해밍 거리(dmin)는 코드워드가 여러 개 있을 때 모든 쌍의 해밍 거리 중 가장 작은 값입니다. 부호의 오류 검출·정정 능력을 결정하는 것은 개별 거리가 아니라 이 최솟값입니다.
오류 검출 능력과 정정 능력 공식이 헷갈립니다.
검출은 td ≤ dmin − 1, 정정은 tc ≤ ⌊(dmin − 1)/2⌋입니다. 검출은 "뭔가 틀렸다"만 알면 되므로 거리에서 1만 빼면 되고, 정정은 "원래 무엇이었는지"까지 알아맞혀야 하므로 그 절반까지만 가능합니다. dmin이 3이면 검출 2개, 정정 1개입니다.
눈에 똑같은 한글 두 개가 거리 2로 나옵니다. 계산기가 잘못된 건가요?
아닙니다. 유니코드 정규화 형식이 다른 경우입니다. 같은 "가족"이라도 완성형(NFC)과 자모 분리형(NFD)은 내부 구성이 달라 다른 값으로 취급됩니다. 화면의 NFC 정규화 칩을 켜면 같은 기준으로 맞춰 비교하고 거리가 0으로 나옵니다.
입력한 값이 서버로 전송되나요?
전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄집니다. 해시나 내부 코드값을 붙여넣는 도구라 이 부분은 특히 신경 썼습니다.