Foundry
URL 단축기 설계
심화
핵심

키를 만드는 세 방법

왕복과 추측 가능성이 선택을 가른다

길이 7자를 정했습니다. 이제 그 7자를 무엇으로 채울지 고릅니다. 방법이 셋이고 각각 다른 대가가 있습니다.

주소를 해시하는 방법과 번호를 바꾸는 방법과 무작위로 뽑는 방법의 비교 주소를 해시해 앞자리를 쓴다 같은 주소면 같은 키 겹치면 확인하고 다시 만든다 확인 왕복이 든다 번호를 문자로 바꾼다 겹치지 않는다 번호가 이미 유일하다 대신 다음 키를 추측할 수 있다 무작위로 뽑는다 추측이 어렵다 공간이 비어 있으면 거의 안 겹친다 겹치면 다시 뽑는다 고를 기준은 왕복과 추측 가능성이다

주소를 해시해 앞자리를 쓴다

원래 주소를 해시하고 앞 7자를 씁니다. 같은 주소면 같은 키가 나오므로 재사용이 저절로 됩니다.

문제는 다른 주소가 같은 앞자리를 낼 수 있다는 것입니다. 그러면 저장 전에 이미 있는지 확인해야 하고, 겹치면 뒤에 무언가를 붙여 다시 해시해야 합니다. 확인 왕복이 쓰기 경로에 붙습니다.

그리고 요구사항이 재사용을 요구하지 않으므로 이 방법의 장점을 쓰지 않습니다. 장점 없이 왕복만 남습니다.

번호를 문자로 바꾼다

7장에서 만든 유일한 번호를 62가지 문자로 바꿔 씁니다. 번호가 이미 유일하므로 키도 유일하고 확인이 필요 없습니다.

번호 1,000,000 을 62진법으로 바꾸면 4자
번호가 커지면 자릿수가 늘어난다

두 가지 대가가 있습니다. 번호가 순차적이면 다음 키를 추측할 수 있고, 초기에는 자릿수가 짧아 길이가 들쭉날쭉합니다. 앞자리를 채우면 길이는 고정되지만 추측은 더 쉬워집니다.

무작위로 뽑는다

7자를 무작위로 뽑습니다. 앞 단계에서 계산한 대로 사용률이 1퍼센트 미만이라 겹칠 일이 거의 없습니다.

항목내용
추측어렵다. 다음 값에 규칙이 없다
확인필요하다. 다만 거의 한 번에 성공한다
길이늘 7자로 고정된다

이 요구사항에서는 무작위를 고릅니다. 재사용을 포기했으므로 해시 방식의 장점이 없고, 추측 가능성이 남는 것보다 확인 한 번이 낫습니다.

번호 변환도 좋은 선택이 될 때

추측이 문제가 되지 않는 곳이라면 번호 변환이 더 좋습니다. 확인 왕복이 아예 없고, 키가 시간순으로 커져 저장소 삽입도 값쌉니다.

상황맞는 방법
링크가 공개용이고 추측이 무해하다번호 변환
링크에 접근 제한이 있다무작위
같은 주소에 같은 키가 필요하다해시 앞자리

요구사항이 방법을 정합니다. 세 방법 모두 실제로 쓰이고, 어느 것이 더 좋다고 말할 수 없습니다.

두 방법을 섞지 않는다

무작위와 번호 변환을 함께 쓰면 같은 키 공간에서 두 규칙이 돌아갑니다. 그러면 무작위로 뽑은 값이 번호 변환의 결과와 겹칠 수 있고, 어느 규칙이 그 키를 만들었는지 알 수 없어 문제를 찾기 어려워집니다.

섞어야 한다면 공간을 나눕니다. 예를 들어 첫 글자로 구분해 규칙마다 다른 영역을 쓰게 합니다.

면접에서 이렇게 나옵니다

Q.단축 키를 만드는 방법을 비교해 주세요

세 방법이 있고 왕복과 추측 가능성이 갈립니다.

방법성질
주소를 해시해 앞자리같은 주소면 같은 키. 겹칠 수 있어 확인이 필요하다
번호를 문자로 바꾸기확인이 필요 없다. 다음 키를 추측할 수 있다
무작위로 뽑기추측이 어렵다. 확인이 필요하지만 거의 한 번에 성공한다

이 요구사항에서는 무작위를 고릅니다. 재사용을 포기했으므로 해시 방식의 장점이 없고, 추측 가능성이 남는 것보다 확인 한 번이 낫습니다.

흔한 실수: 하나를 정답으로 외우는 것. 세 방법 모두 실제로 쓰이고 요구사항이 방법을 정합니다. 추측이 무해한 공개 링크라면 번호 변환이 더 좋습니다.

Q.해시 앞자리 방식의 문제는 무엇인가요

장점을 쓰지 않는데 왕복만 남습니다.

같은 주소면 같은 키가 나오는 것이 이 방식의 장점입니다. 그런데 요구사항이 재사용을 요구하지 않으므로 그 장점이 쓸모가 없습니다.

문제는 남습니다. 다른 주소가 같은 앞자리를 낼 수 있어 저장 전에 확인해야 하고, 겹치면 뒤에 무언가를 붙여 다시 해시해야 합니다.

확인 왕복이 쓰기 경로에 붙는다
겹치면 그 과정을 반복한다

흔한 실수: 해시 함수를 더 좋은 것으로 바꾸면 겹침이 없어진다고 보는 것. 7자로 자르는 순간 가능한 값이 3조 5천억으로 제한됩니다. 해시 품질과 무관하게 겹침은 남습니다.

Q.번호를 문자로 바꾸는 방식의 대가는 무엇인가요

다음 키를 추측할 수 있고, 초기에 길이가 들쭉날쭉합니다.

번호가 이미 유일하므로 키도 유일하고 확인이 필요 없습니다. 이것이 큰 장점입니다.

번호가 순차적이면 다음 키가 예상된다
번호가 작을 때는 자릿수가 짧다

앞자리를 채워 길이를 고정하면 오히려 추측이 쉬워집니다. 남은 자리가 뻔해지기 때문입니다.

추측이 문제가 되지 않는 공개 링크라면 이 방식이 더 좋습니다. 확인 왕복이 아예 없고 키가 시간순으로 커져 저장소 삽입도 값쌉니다.

흔한 실수: 번호를 섞어 추측을 막으려는 것. 규칙이 알려지면 되돌릴 수 있고, 규칙을 비밀로 두는 것은 비밀이 유지되는 동안만 유효합니다. 추측을 막으려면 무작위를 쓰는 편이 정직합니다.

Q.두 방법을 함께 쓰면 안 되나요

같은 키 공간에서 두 규칙이 돌면 문제를 찾기 어려워집니다.

무작위로 뽑은 값이 번호 변환의 결과와 겹칠 수 있고, 그때 어느 규칙이 그 키를 만들었는지 알 수 없습니다.

섞어야 한다면 공간을 나눕니다.

첫 글자로 구분해 규칙마다 다른 영역을 쓴다
그러면 겹칠 수 없고 출처도 분명하다

대가는 각 규칙이 쓸 수 있는 공간이 줄어드는 것입니다. 앞 단계에서 계산한 여유가 있으므로 이 규모에서는 문제가 없습니다.

흔한 실수: 마이그레이션 중에 두 규칙을 잠깐 함께 쓰는 것. "잠깐" 이 문제입니다. 그 기간에 만들어진 키는 영구히 남아 나중에 출처를 구분할 수 없습니다.

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

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

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