도구스개발

조브리스트 해싱 계산기

판 위의 (칸, 말) 조합마다 난수를 두고 XOR로 판 전체의 해시를 만듭니다. 한 수를 두면 XOR 두 번으로 해시가 갱신되는 것과, 그 값이 처음부터 다시 계산한 값과 정확히 같은 것을 직접 확인할 수 있습니다.

점(.)은 빈 칸, 나머지 글자가 말입니다. 행은 줄바꿈이나 «/» 로 나눕니다.

씨앗이 같으면 언제나 같은 난수 표가 나옵니다. 같은 해시를 다시 만들 수 있습니다.

판 전체의 해시

0xa1782a6c65b4667b

놓여 있는 말 6개의 난수를 모두 XOR 한 값입니다. 말의 종류는 5가지, 칸은 9개입니다.

r
n
b
p
p
R

칸 번호는 「행,열」이고 왼쪽 위가 0,0입니다.

「행,열 -> 행,열」. 규칙은 보지 않으니 아무 칸에서 아무 칸으로 옮겨 보세요.

두기 전 해시0xa1782a6c65b4667b
XOR (빼기) 2,2의 R0xd48210ddb8270f9c
XOR (더하기) 1,1의 R0x24d32d1399489901
XOR로 갱신한 해시0x512917a244dbf0e6
처음부터 다시 계산한 해시0x512917a244dbf0e6
두 값이 같은지일치합니다
XOR 2번으로 끝났습니다. 판을 처음부터 다시 훑지 않고 옛 해시에 «떠난 자리의 키» 와 «도착한 자리의 키» 만 XOR 했는데, 다시 계산한 값과 정확히 같습니다. 그리고 무르는 것도 똑같이 XOR 두 번입니다. XOR은 자기 자신이 역연산이라 같은 값을 두 번 넣으면 없던 일이 됩니다.

한 수 뒤의 판

r
n
b
p
R
p

난수 표 (앞부분)

Rbnpr
0,00x2211820x346edc0x1e9a570x2d160e0x81c2e6
0,10x5647e50x1f66220x6e74110x7ad3400xde15ea
0,20x2f43a90x61571b0xc3e04a0xe0b2f20xf871ca
1,00x6441550xc8c99c0x8258510xcfadec0x6049a8
1,10x24d32d0x4b29d60x2cf21c0x3e147a0x2d41a8
1,20x56acac0x01cb440x1c40200x34b63a0x2d1d49
2,00xd03f720xdf6f910xd14b5a0x32c9620xb7e005
2,10x28da850x4299ff0x575ab70x69745f0xc1e57d
2,20xd482100x87bd640xde79320x714e9f0x1b9edd

(칸, 말) 조합마다 64비트 난수가 하나씩 있습니다. 자리를 아끼려고 앞 8자리만 보였고, 칸이 많으면 앞 12줄만 보입니다. 씨앗이 같으면 언제나 이 표가 그대로 나옵니다.

64비트에서 충돌할 확률2.711e-8
32비트였다면100.000%
64비트라도 충돌은 납니다. 생일 문제로 계산하면 판 1,000,000개를 담을 때 서로 다른 두 판이 같은 해시를 가질 확률이 위와 같습니다. 백만 개면 2.7×10⁻⁸이지만 십억 개면 2.7%까지 오릅니다 — 엔진이 32비트가 아니라 64비트를 쓰는 이유이자, 그래도 아주 드물게 잘못된 판을 재사용하는 일이 생기는 이유입니다. dev/id-collision과 같은 계산입니다.
XOR은 순서에 상관없습니다. 말을 어떤 순서로 놓든 같은 해시가 나오고, 수순이 달라도 같은 판이면 같은 해시가 나옵니다. 그래서 「수순은 달랐지만 같은 판」을 같은 것으로 알아보고 이미 계산해 둔 결과를 재사용할 수 있습니다 — 전치표(transposition table)라는 이름이 여기서 나옵니다.

사용 방법

  1. 1판을 적습니다. 점(.)은 빈 칸이고 나머지 글자가 말입니다.
  2. 2씨앗을 정하면 (칸, 말)마다 난수가 하나씩 정해집니다.
  3. 3판 전체의 해시를 확인합니다.
  4. 4수를 「행,열 -> 행,열」로 적어 XOR 두 번으로 갱신되는 과정을 봅니다.
  5. 5갱신한 값과 처음부터 다시 계산한 값이 같은지 확인합니다.

자주 묻는 질문

판 위의 (칸, 말) 조합마다 난수를 하나씩 미리 뽑아 두고, 놓여 있는 것들의 난수를 모두 XOR한 값을 그 판의 해시로 쓰는 방법입니다. 1970년 앨버트 조브리스트가 바둑 프로그램을 위해 내놓았고, 지금 체스·바둑 엔진의 전치표가 모두 이것 위에 서 있습니다.

한 수에 XOR 두 번으로 해시가 갱신되기 때문입니다. 말을 a에서 b로 옮기면 새 해시 = 옛 해시 XOR key(a, 말) XOR key(b, 말)입니다. 판을 처음부터 다시 훑을 필요가 없어 탐색 트리에서 초당 수백만 번씩 판이 바뀌어도 감당이 됩니다.

똑같이 XOR 두 번입니다. XOR은 자기 자신이 역연산이라 같은 값을 두 번 넣으면 없던 일이 됩니다. 두었다 물렀다를 되풀이하는 게임 트리 탐색에 이보다 잘 맞는 성질이 없습니다.

이미 계산해 본 판을 해시로 찾아 쓰는 표입니다. XOR은 순서에 상관없으므로 「수순은 달랐지만 같은 판」이 같은 해시를 갖고, 그래서 같은 판을 두 번 계산하지 않게 됩니다. 「전치(transposition)」란 서로 다른 수순이 같은 판에 이르는 것을 말합니다.

서로 다른 두 판을 같은 것으로 착각합니다. 64비트라면 판 백만 개를 담아도 확률이 2.7×10⁻⁸이지만, 십억 개면 2.7%까지 오릅니다. 엔진이 32비트가 아니라 64비트를 쓰는 이유이고, 그래도 아주 드물게 잘못된 판을 재사용하는 일이 생기는 이유이기도 합니다.

씨앗 하나에서 결정적으로 뽑습니다. 이 도구는 splitmix64를 씁니다. 씨앗이 같으면 언제나 같은 표가 나오므로, 같은 해시를 재현할 수 있고 프로그램을 껐다 켜도 같은 전치표를 쓸 수 있습니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이뤄지고, 입력한 판과 씨앗은 이 기기에만 남습니다.

알아두면 좋은 점

  • 정답지는 재계산입니다. XOR 두 번으로 갱신한 해시가 옮긴 뒤의 판을 처음부터 다시 훑어 계산한 값과 같아야 합니다. 네 가지 판에서 가능한 모든 (출발 칸, 도착 칸) 짝을 돌려 한 건도 어긋나지 않는 것을 확인했습니다.
  • 무르는 것도 검사합니다. 같은 수를 되돌리면 원래 해시로 «정확히» 돌아와야 합니다.
  • 잡는 수는 잡힌 말의 키를 한 번 더 빼야 합니다. 이 자리를 놓치면 해시가 어긋나므로 따로 검사에 넣었습니다.
  • XOR이 순서에 상관없다는 것도 검사합니다. 말을 놓는 순서를 뒤집어도, 두 수의 순서를 바꿔도 같은 판이면 같은 해시가 나옵니다 — 전치표가 성립하는 근거입니다.
  • 난수 표는 씨앗이 같으면 언제나 같고, 64비트를 벗어나지 않으며, 384개를 뽑아도 겹치지 않는 것을 확인했습니다.
  • 충돌 확률은 생일 문제로 계산합니다. 아주 작은 확률에서 1 − exp(x)를 그대로 계산하면 자릿수를 잃고 0으로 뭉개지므로, 지수가 아주 작을 때는 −x로 대신 계산합니다.
  • 칸은 400개까지, 말의 종류는 20가지까지 다룹니다.
  • 이 도구는 해시가 어떻게 움직이는지 보이는 것이 목적이라 규칙(어느 말이 어디로 갈 수 있는지)은 보지 않습니다. 아무 칸에서 아무 칸으로 옮길 수 있습니다.

함께 보면 좋은 도구

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