16강 / 20강
비둘기집 원리 — 세어 보지 않고도 아는 것
너무 당연해서 강력한 원리
비둘기 10마리를 집 9개에 넣으면, 적어도 한 집에는 두 마리 이상이 들어갑니다. 너무 당연하죠? 그런데 이 당연한 말이 놀라운 결론들을 만들어 냅니다.
비둘기집 원리 — n개의 물건을 k개의 상자에 넣으면
(n > k), 적어도 한 상자에는 ⌈n/k⌉개 이상이 들어간다.
비결은 무엇을 비둘기로, 무엇을 집으로 볼 것인가를 정하는 데 있습니다. 그것만 정하면 나머지는 자동이에요.
세어 보지 않고도 '반드시 있다'를 말할 수 있습니다.
Python
브라우저에서 실행
🎮 비둘기를 집에 넣어 보세요
비둘기 수와 집 수를 조절하며 언제 충돌이 확정되는지 확인해 보세요. 무작위로 넣어 보는 버튼을 누르면 실제로도 늘 겹친다는 걸 볼 수 있습니다.
해시 충돌은 피할 수 없습니다
10강에서 해시 함수는 단사가 아니라고 했죠. 이제 왜 그럴 수밖에 없는지 증명할 수 있습니다.
- 비둘기 = 가능한 입력 (비밀번호, 파일, 문자열… 무한히 많음)
- 집 = 해시 값 (SHA-256이라도
2²⁵⁶개, 유한함)
무한을 유한에 넣으므로 충돌은 반드시 존재합니다. 좋은 해시 함수의 목표는 "충돌이 없게" 만드는 것이 아니라 — 그건 불가능하니까 — 충돌을 찾기 어렵게 만드는 것입니다.
이름 9개, 칸 8개 — 비둘기집 원리가 충돌을 보장합니다.
Python
브라우저에서 실행
'적어도 하나'는 여집합으로. 13강에서 배운 그대로입니다.
Python
브라우저에서 실행
집을 '나머지'로 잡는 것이 이 문제의 열쇠입니다.
Python
브라우저에서 실행
🤔 확인 문제
서랍에 검정 양말 10짝, 흰 양말 10짝이 섞여 있습니다. 어두운 방에서 같은 색 한 켤레를 확실히 만들려면 최소 몇 짝을 꺼내야 할까요?
해설 색이 2가지(집 2개)이므로 3짝을 꺼내면 어느 색인가는 2짝이 됩니다. 2짝은 서로 다른 색일 수 있어 보장이 안 돼요. 11짝은 서로 다른 색 한 켤레를 보장할 때 필요한 수입니다.
🤔 확인 문제
해시 충돌이 원리적으로 피할 수 없는 이유는?
해설 무한한 비둘기를 유한한 집에 넣는 셈이므로 충돌은 반드시 존재합니다. 그래서 암호학적 해시의 목표는 충돌을 없애는 것이 아니라 찾기 어렵게 만드는 것이에요.
🤔 확인 문제
생일이 같은 두 사람이 있을 확률이 50%를 넘는 최소 인원은? (윤년 무시)
해설 23명입니다 — 비교되는 쌍이
C(23,2)=253쌍이나 되기 때문이에요. 367명은 확률 50%가 아니라 100% 보장에 필요한 수(비둘기집)입니다. 둘을 구별하는 것이 이 강의의 핵심이에요.