最終更新:2026-10-12
C++ 短縮URLサービス Demo¶
本物の短縮URLは比較的複雑で、例えばハッシュアルゴリズムや採番システムなどが必要になります。
今日はあくまで小規模プロジェクトの観点から、短縮URLの実装をシミュレートします。
わずか数十行のコードでどうやって素早く実現するのでしょうか?その中で鍵となるいくつかのポイント:
- 長いURLをどのように短縮するか
- マッピング関係をどのように保存するか
マッピング関係は言うまでもなく、map を 1 つ用意してメモリに永続化します。データベースが絡む場合は、jdbc/odbc などのデータベースインターフェース経由で書き込む必要があります。
長いURLの短縮には、ここでは乱数アルゴリズム+固定長という考え方を採用します。
1.乱数¶
uniform_int_distribution を使って [a, b] 区間の乱数を生成します。ここでは毎回以下の文字列からランダムに 1 文字を取り出し、最後に連結すれば短縮URLのできあがりです。
含まれているのは:
- 数字
- 小文字
- 大文字
uniform_int_distribution<int> distribution(0, characters.size() - 1);
string code;
for (int i = 0; i < length; ++i)
code += characters[distribution(generator)];
2.保存¶
毎回それを map に保存するだけです。例えば:
if (links.count(originalLink)) {
return links[originalLink];
}
shortCode = generateRandomCode(len);
string shortenedLink = base_url + shortCode;
links[shortenedLink] = originalLink;
ここでは基本の url を残しています。例えば:
string baseUrl = "https://www.google.com.hk/search";
LinkShortener shortener(baseUrl);
string originalLink = "https://www.google.com.hk/search?q=asdsad&oq=asdsad&aqs=chrome.0.69i59j69i57j69i59l2.634j0j4&sourceid=chrome&ie=UTF-8";
string shortenedLink = shortener.shortenLink(originalLink, 8);
最後に、この url を次のように短縮できます:
とても簡単でしょう。この節のテストと完全なコードは星球で更新済みです。ぜひ参加して一緒に学び、成長していきましょう〜
関連トピック¶
- C++ FnOnce を手書きする | C++那些事
- C++ gRPC ミニプロジェクト | C++那些事
- C++ プロセス間通信実践 | C++那些事
- C++17 と SQLite でディレクトリサイズを集計 | C++那些事
- Google Benchmark 性能テスト | C++那些事
- C++20 コルーチン HTTP サーバ | C++那些事
- Protobuf ZeroCopy シリアライズ | C++那些事
- pybind11 で Python を高速化 | C++那些事
- C++ スタック型電卓の設計 | C++那些事