URL圧縮サービスなどで使われている「http://xxx.com/?Tx1aq5」みたいなURLの「Tx1aq5」のような文字列ってどうやって生成しているんでしょうか?使用可能な文字をランダムに並べているのはわかるのですが、URL圧縮サービスのように固有の文字列を振り当てているのはどのようなアルゴリズムをとっているのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2006/08/19 20:05:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:STRing No.1

回答回数351ベストアンサー獲得回数36

ポイント20pt

単純に、

http://hoge.example.com == xialm

http://huga.example.org == jklls

みたいにランダム生成した文字列と関連付けるデータベースがあるのだと思いますよ。

実際には有効期限や最終アクセスなどもデータベース化しているかも。

# url は当然ながらダミーです。

id:STRing No.2

回答回数351ベストアンサー獲得回数36

ポイント20pt

失礼しました。そういう次元ではないですね。


双方向関数を使っているのだと思います。

hoge から xxxxx に、 xxxxx から hoge に双方向に変換できる関数です。


# 恥の雪ぎ程度なので詳しくありません……

# むしろ恥の上塗り。

# http://www.example.com/

id:ikasamt

説明不足で申し訳ございません。おっしゃるよなことをしているのはわかるのですが、具体的な関数の仕組みが知りたいです。

2006/08/12 21:56:25
id:mass3 No.3

回答回数118ベストアンサー獲得回数15

ポイント20pt

ビデオの録画予約をするための「Gコード」のアルゴリズムが近いと思います。

http://members.at.infoseek.co.jp/gcode/

出現する要素が限られているのをうまく利用した方法ですね。

id:ikasamt

回答ありがとうございます。Gコードって複雑な仕組みをとっているんですね。確かにURL圧縮で使われているアルゴリズムと似ている部分もある気がします。

2006/08/13 00:25:18
id:kurukuru-neko No.4

回答回数1844ベストアンサー獲得回数155

ポイント20pt

単純な方法

5桁の文字に変換するとする場合、

a-z,A-Z,0-9をが使えるとすると

26+26+10=62種類の文字が使える。

合計 62^5= = 916132832(16進数 369B13E0 ) < 2^31

整数にすると 4byteの整数で表現可能な範囲

1. データベースにURLを連番で登録を行う。

データは登録した順に1~62^5-1の順の間

の数字を連番で付与したUniqueキー

2. 1.の連番を62進数の5桁に変換

3. http:///xxxx.com/?abcdef

でアクセスすると

abcdefを10進数よりUniqueキーにより

検索して、URLにリダイレクトする。

実際には連番ではなく、キーとして5文字の

文字を保存したり、連続割り当てせずに

乱数でに数値を発生させて、未使用の場所を

任意に割り当てを行ったり、事前に乱数で

登録される上限個数を決めておき、事前に

乱数で発生させて重複しないものを順番に

割り当てを行ったり等多様な方法での文字

への変換方法を考えることが出来る。

id:ardarim No.5

回答回数897ベストアンサー獲得回数145

ポイント20pt

ハッシュ+文字エンコードのような感じではないでしょうか。


ハッシュとは、簡単に言って不定長のデータ(例えばURLなどの文字列)を、固定長(例えば数バイト)の「要約データ」に圧縮する技術です。数バイトに要約する以上、全く別の2つのデータ(URL)が同じハッシュを共有してしまう可能性がありますが、ハッシュアルゴリズムには数学的な観点からそのような衝突の可能性が極めて小さいアルゴリズムが選択されているため、そのようなことは滅多に起きないとされています。

ハッシュで検索すれば詳しい技術情報がすぐ出てきます。

例えばこの辺ですね。

http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%...


ただハッシュ化しただけでは人間が認識できないバイナリデータになりますので、それをさらにBASE64などの文字化ルーチンに通しているのだと思います。BASE64はバイナリデータをアルファベットの大文字(26文字)、アルファベットの小文字(26文字)、数字(0~9までの10文字)、記号(「+」と「/」の2文字)の64文字に変換するもので、インターネット関連のプロトコルではよく使われています。(例えばメールの添付ファイルなどはBASE64でエンコードされていることが多いです)

http://www.atmarkit.co.jp/icd/root/21/5784921.html

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません