도구스개발

SimHash 지문·해밍거리 계산기

문서 두 개를 64비트 지문으로 줄이고 해밍 거리로 얼마나 닮았는지 잽니다. 지문의 어느 비트가 다른지, 거리에서 되짚은 코사인 유사도가 실제 값과 얼마나 벌어지는지까지 함께 볼 수 있습니다.

66토막으로 쪼갰습니다.

69토막으로 쪼갰습니다.

글자

한글은 3~5글자가 무난합니다. 짧게 잡으면 아무 글이나 닮아 보이고, 길게 잡으면 조금만 고쳐도 확 멀어집니다.

해밍 거리

10 / 64비트

임계값 3 이하를 중복으로 보면 이 쌍은 중복이 아닙니다. 실제 코사인 유사도는 88.9%입니다.

비트

구글 논문(WWW 2007)이 64비트 지문에 쓴 값이 3입니다. 올리면 놓침이 줄고 헛걸음이 늡니다.

지문 A7a001d2e430c13d0
지문 B7a425d6e730d97d4
다른 비트10개
거리에서 되짚은 코사인88.2%
곧이곧대로 계산한 코사인88.9%
추정 오차0.7%p
자카드 (MinHash가 재는 값)80.0%
토막 수66 / 69가지

지문 64비트 (다른 자리가 파랗습니다)

0
1
1
1
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
0
1
0
0
1
0
1
1
1
0
0
1
0
0
0
0
1
1
0
0
0
0
1
1
0
0
0
0
0
1
0
0
1
1
1
1
0
1
0
0
0
0

칸에 적힌 숫자는 글 A의 지문입니다. 파란 칸은 글 B와 값이 다른 자리이고, 그 개수가 곧 해밍 거리입니다.

가중치를 부호로 더해 비트를 정합니다. 토막마다 64비트 해시를 내고, 비트 자리마다 1이면 +가중치, 0이면 −가중치를 더합니다. 다 더한 뒤 양수인 자리만 1로 굳히면 문서 하나가 64비트 하나가 됩니다. 그래서 자주 나오는 토막일수록 지문을 세게 끌어당깁니다.
MinHash는 자카드를, SimHash는 코사인을 잽니다. 같은 낱말을 쓰지만 빈도가 다른 두 글은 자카드로 보면 1이지만 코사인으로 보면 1보다 작습니다. 「무엇이 들어 있느냐」와 「얼마나 자주 나오느냐」의 차이이고, 어느 쪽이 맞는지는 무엇을 중복으로 볼지에 달렸습니다.
거리 3 이하를 중복으로 보는 관행은 구글이 웹 문서 80억 개를 다룬 논문(WWW 2007)에서 64비트 지문에 k = 3을 쓴 데서 왔습니다. 그 규모·그 토막 방식에서 놓침과 헛걸음이 가장 견딜 만했다는 뜻이지 모든 데이터에 맞는 상수가 아닙니다. 위의 임계값을 바꿔 가며 판정이 어떻게 갈리는지 직접 보는 편이 낫습니다.
되짚은 유사도는 어디까지나 추정입니다. 비트 하나는 임의의 초평면으로 벡터를 갈랐을 때 어느 쪽인지에 해당하고, 두 벡터가 이루는 각이 θ이면 한 비트가 다를 확률이 θ/π입니다. 그래서 d개가 다르면 코사인이 대략 cos(π·d/64)인데, 64번 던진 결과가 평균에서 벗어나는 만큼 오차가 남습니다. 위에서 추정값과 실제 값을 나란히 놓아 그 차이를 볼 수 있게 했습니다.

사용 방법

  1. 1견줄 글 두 개를 넣습니다.
  2. 2토막 내는 방식을 고릅니다. 짧은 글이나 한글은 글자 n-gram이 낫습니다.
  3. 3두 지문의 해밍 거리를 봅니다. 작을수록 닮은 글입니다.
  4. 4어느 비트가 다른지 표에서 확인합니다.
  5. 5중복 판정 임계값을 바꿔 가며 판정이 어떻게 갈리는지 봅니다.

자주 묻는 질문

문서를 64비트 지문 하나로 줄여 닮음을 재는 방법입니다. 문서를 토막으로 쪼개 토막마다 해시를 내고, 비트 자리마다 1이면 +가중치, 0이면 −가중치를 더한 뒤 부호만 남겨 지문을 만듭니다. 닮은 문서는 지문도 닮으므로 다른 비트의 개수(해밍 거리)로 비슷한 정도를 잽니다.

MinHash는 자카드 유사도를, SimHash는 코사인 유사도를 잽니다. SimHash는 가중치를 부호로 더해 비트를 정하므로 자주 나오는 낱말이 지문을 더 세게 끌어당깁니다. 「어떤 낱말이 들어 있느냐」가 아니라 「어떤 낱말이 얼마나 자주 나오느냐」로 닮음을 보는 셈이라, 같은 낱말을 쓰지만 빈도가 다른 두 글을 다르게 봅니다.

구글이 웹 문서 80억 개를 다룬 논문(Manku·Jain·Das Sarma, WWW 2007)에서 64비트 지문에 k = 3을 쓴 데서 왔습니다. 그 규모와 그 토막 방식에서 놓침과 헛걸음이 가장 견딜 만했다는 뜻이지, 모든 데이터에 맞는 상수가 아닙니다. 임계값을 올리면 놓치는 중복이 줄고 엉뚱한 쌍을 중복으로 보는 헛걸음이 늘며, 내리면 반대가 됩니다.

되짚을 수 있지만 어디까지나 추정입니다. SimHash의 비트 하나는 임의의 초평면으로 벡터를 갈랐을 때 어느 쪽인지에 해당하고, 두 벡터가 이루는 각이 θ일 때 한 비트가 다를 확률이 θ/π입니다. 그래서 64비트 중 d개가 다르면 코사인 유사도가 대략 cos(π·d/64)입니다. 이 도구는 그 추정값과 실제 코사인 유사도를 나란히 보여 줍니다.

64비트는 표본으로 적기 때문입니다. 비트마다 다를 확률이 θ/π라는 것은 평균 이야기이고, 64번 던진 결과가 그 평균에서 몇 개쯤 벗어나는 것은 자연스럽습니다. 게다가 해시 비트는 진짜 무작위 초평면이 아니라 해시 함수가 흩뿌린 결과일 뿐입니다. 지문 길이를 늘리면 추정이 촘촘해지지만 비교 비용도 함께 커집니다.

짧은 글이나 한글에는 글자 n-gram이 낫습니다. 낱말로 쪼개면 토막이 몇 개 안 나와 지문이 크게 흔들리고, 한글은 조사가 붙어 「날씨가」와 「날씨는」이 서로 다른 토막이 되기 때문입니다. 긴 영문 문서라면 낱말 단위로도 충분합니다.

전송되지 않습니다. 지문 계산과 비교는 모두 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 해시는 FNV-1a 64비트입니다. 암호용이 아니라 고르게 흩뿌리는 용도이며, 참조 구현이 공개한 표준 시험값(빈 문자열·"a"·"foobar")과 파이썬으로 따로 계산한 값을 테스트에 박아 두었습니다.
  • 해밍 거리는 비트를 한 자리씩 견주는 무식한 방법과 대조해 고정했고, 대칭성과 삼각부등식도 함께 검사합니다.
  • 거리에서 되짚은 코사인 유사도는 추정입니다. 가중치 벡터로 곧이곧대로 계산한 코사인을 정답지로 함께 보여 주므로 오차를 눈으로 확인할 수 있습니다.
  • 유사도의 근거는 임의 초평면 반올림(Charikar, 2002)이고, 거리 임계값 k = 3은 64비트 지문을 쓴 구글 논문(WWW 2007)의 값입니다. 데이터가 다르면 임계값도 다시 정해야 합니다.
  • 글은 각 20,000자까지 다룹니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.