Foundry
URL 단축기 설계
중급
핵심

키 공간 계산하기

얼마나 비어 있는지가 충돌 빈도를 정한다

키 7자 이하 에 누적 300억 개 을 담아야 합니다. 이 두 숫자로 길이를 계산합니다. 감으로 정하지 않습니다.

문자 집합과 길이

숫자 10개와 대문자 26개와 소문자 26개를 쓰면 자리마다 62가지입니다. 길이가 하나 늘면 개수가 62배가 됩니다.

같은 크기의 통으로 보면 길이마다 300억이 채우는 비율이 크게 다르다 누적 300억 개가 그 길이의 키 공간에서 차지하는 비율 5자 9억 2천만. 다 넣지 못한다 6자 568억. 절반이 찬다 7자 3조 5천억. 1퍼센트 미만 통 길이는 같게 그렸다. 실제 개수는 길이마다 62배씩 다르다 채운 비율이 곧 새 키가 이미 쓰인 것과 겹칠 확률이다 그래서 얼마나 비어 있는지가 충돌 빈도를 정한다
길이담을 수 있는 개수판정
5자약 9억 2천만부족하다
6자약 568억누적 300억 개 이면 절반이 찬다
7자약 3조 5천억1퍼센트도 쓰지 않는다

7자를 고릅니다. 6자로도 개수는 담기지만 그것이 왜 위험한지가 다음 이야기입니다.

절반이 차면 무슨 일이 생기나

키를 무작위로 뽑는다면 이미 쓰인 키를 뽑을 확률이 곧 사용률입니다.

6자에 300억을 담으면 사용률이 약 53퍼센트
새 키를 뽑을 때 절반은 이미 쓰인 것과 겹친다

겹치면 다시 뽑아야 하고, 다시 뽑을 때마다 이미 있는지 확인하는 왕복이 듭니다. 사용률이 올라갈수록 평균 시도 횟수가 늘어납니다.

7자는 사용률이 1퍼센트 미만이라 겹칠 일이 거의 없습니다. 키 공간의 여유는 충돌 처리 비용을 낮추기 위한 것입니다.

문자 집합을 줄이면

읽기 쉽게 만들려고 헷갈리는 문자를 빼는 경우가 있습니다. 숫자 0과 대문자 O, 숫자 1과 소문자 l 같은 것입니다.

문자 집합자리당7자 개수
62가지62약 3조 5천억
58가지58약 2조 1천억

개수가 40퍼센트 줄지만 여전히 충분합니다. 사용률이 1퍼센트대에서 1.4퍼센트대로 오를 뿐입니다. 사람이 손으로 옮겨 적는 링크라면 이 교환이 이득입니다.

대소문자를 쓸 수 없는 경우

주소의 일부를 대소문자 구분 없이 다루는 환경이 있습니다. 그러면 자리당 36가지가 되고 7자는 약 780억입니다. 누적 300억 개 을 담으면 사용률이 38퍼센트라 6자와 비슷한 상황이 됩니다.

그때는 8자로 늘려야 합니다. 이렇게 문자 집합이 길이를 정하므로 두 값을 함께 결정합니다.

계산을 문서에 남긴다

키 길이는 한 번 정하면 바꾸기 어렵습니다. 이미 발급한 키가 남아 있기 때문입니다.

그래서 어떤 가정으로 이 길이를 골랐는지 적어 둡니다. 보관 기간, 하루 생성량, 문자 집합, 목표 사용률입니다. 가정이 달라지면 그 계산을 다시 하면 됩니다.

면접에서 이렇게 나옵니다

Q.단축 키 길이를 어떻게 정하시겠습니까

필요한 개수를 담는 가장 짧은 길이로 정합니다. 62가지 문자를 쓰면 길이마다 62배씩 달라집니다.

길이개수판정
5자약 9억 2천만부족하다
6자약 568억누적 300억 개 이면 절반이 찬다
7자약 3조 5천억1퍼센트도 안 쓴다

7자를 고릅니다. 개수만 보면 6자로도 담기지만 사용률이 절반이면 충돌이 잦아집니다.

흔한 실수: 담을 수 있는지만 확인하고 끝내는 것. 담기는 것과 여유 있게 담기는 것은 다릅니다. 사용률이 곧 충돌 확률이므로 그 값까지 계산해야 길이 선택의 근거가 완성됩니다.

Q.키 공간의 여유가 왜 필요한가요

사용률이 곧 충돌 확률이기 때문입니다.

키를 무작위로 뽑는다면 이미 쓰인 키를 뽑을 확률이 사용률과 같습니다.

6자에 300억을 담으면 사용률 약 53퍼센트
새 키를 뽑을 때 절반은 이미 쓰인 것과 겹친다

겹치면 다시 뽑아야 하고, 그때마다 이미 있는지 확인하는 왕복이 듭니다. 사용률이 올라가면 평균 시도 횟수가 늘어납니다.

7자는 사용률이 1퍼센트 미만이라 거의 한 번에 성공합니다.

흔한 실수: 충돌을 재시도로 해결하면 된다고 답하고 끝내는 것. 재시도 자체가 왕복이므로 사용률이 높으면 쓰기 지연이 늘어납니다. 여유는 그 비용을 없애기 위한 것입니다.

Q.헷갈리는 문자를 빼도 되나요

됩니다. 개수가 줄지만 여유가 충분합니다.

숫자 0과 대문자 O, 숫자 1과 소문자 l 처럼 사람이 혼동하는 문자를 빼면 자리당 58가지가 됩니다.

문자 집합7자 개수사용률
62가지약 3조 5천억1퍼센트 미만
58가지약 2조 1천억1.4퍼센트

사람이 손으로 옮겨 적는 링크라면 이 교환이 이득입니다. 잘못 입력해 다른 사람의 링크로 가는 것을 줄입니다.

흔한 실수: 문자 집합과 길이를 따로 정하는 것. 문자 집합을 바꾸면 개수가 바뀌므로 길이를 다시 계산해야 합니다. 대소문자를 구분하지 못하는 환경이면 자리당 36가지가 되어 7자로는 부족해집니다.

Q.나중에 키 길이를 늘리면 안 되나요

늘릴 수는 있지만 이미 발급한 키가 남습니다.

짧은 키와 긴 키가 섞여 있으면 조회는 문제가 없습니다. 문제는 키를 만들 때의 판단입니다. 새 키를 7자로 뽑는데 6자 키가 이미 있으면 두 공간의 사용률을 따로 관리해야 합니다.

그래서 처음에 계산해 두고 문서에 가정을 남깁니다.

보관 기간, 하루 생성량, 문자 집합, 목표 사용률

가정이 달라지면 그 계산을 다시 합니다.

흔한 실수: 길이를 넉넉하게 잡아 이 문제를 피하려는 것. 다른 설계에서는 여유가 안전이지만 단축기에서는 길이가 곧 서비스 가치입니다. 8자로 시작하면 경쟁 서비스보다 긴 주소를 주는 것입니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

URL 단축기 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.