📎 원리 개요 해시 vs 카운터
https://offset0xf.com/very/long/path?x=1
같은 긴 URL을
https://0xf.ly/aB3
처럼 짧은 코드로 바꾸고, 코드로 접속하면 원래 주소로 302 리다이렉트하는 서비스입니다.
짧은 코드를 만드는 방법은 크게 두 가지입니다.
| 방식 | 원리 | 문제점 |
| 해시 기반 |
MD5/SHA 해시 앞 6~7자 사용 |
해시 충돌 시 재시도 필요 |
| 카운터 기반 |
DB auto-increment ID를 Base62로 변환 |
충돌 없음, ID만큼만 짧아짐 |
실무에서는 카운터 기반이 더 널리 쓰입니다 — 새 URL마다
1씩 증가하는 정수 ID를 발급받고, 그 숫자를 사람이 읽기 좋은 문자열로 압축하기만 하면 되기 때문입니다.
아래 두 패널에서 그 압축 방법(Base62)과 실제 서버 코드를 확인해보세요.
🐍 FastAPI 서버 코드 main.py
# 62진법 알파벳: 0-9, a-z, A-Z
BASE62 = (
"0123456789abcdefghijkl"
"mnopqrstuvwxyzABCDEFG"
"HIJKLMNOPQRSTUVWXYZ"
)
def encode(num: int) -> str:
if num == 0:
return BASE62[0]
chars = []
while num > 0:
num, rem = divmod(num, 62)
chars.append(BASE62[rem])
return "".join(reversed(chars))
# DB의 PK(auto-increment)가 곧 카운터 역할
@app.post("/api/shorten")
async def shorten(url: HttpUrl):
row = await db.insert(long_url=str(url))
code = encode(row.id) # 예: 1000 → "g8"
return {"short_url": f"https://0xf.ly/{code}"}
@app.get("/{code}")
async def redirect(code: str):
original = await db.find_by_code(code)
if not original:
raise HTTPException(404)
return RedirectResponse(original, status_code=302)