私のクライアントには、400,000 を超える顧客のデータベースがあります。各顧客には GUID が割り当てられます。彼は、すべてのレコードを選択して、この GUID をパラメーターとして含む動的な「短い URL」を作成するように求めています。次に、この短い URL を各クライアント レコードのフィールドに保存します。
最初の質問は、URL 短縮サイトで、このようにプログラムでその場で短い URL を作成できるものはありますか?
TinyUrl を使用すると、それを行うことができます (広く文書化されていません)。たとえば、次のようになります。
http://tinyurl.com/api-create.php?url=http://www.stackoverflow.com/
http://tinyurl.com/6fqmtuになります
だから、あなたが持つことができます
http://tinyurl.com/api-create.php?url=http://mysite.com/user/xxxx-xxxx-xxxx-xxxx
GUID はそれほど明確ではありませんが、URL は一意である必要があります
これを HTTPWebRequest に渡して応答を取得する必要があることに注意してください。
この URL は十分に短くありません:?
http://www.clientsdomain.com/?customer=267E7DDD-8D01-4F38-A3D8-DCBAA2179609
注: 個人的には、クライアントが奇妙なことを求めていると思います。各顧客レコードに URL フィールドを作成するように依頼することで (これは、決定論的アルゴリズムを介して顧客の GUID に基づいています)、実際には、データベースを非正規化するように依頼しています。
URL 短縮サイトが使用するアルゴリズムは非常に単純です。
2 番目のステップで 6 つの小文字を使用するだけで、現在のアプリケーションが必要とするより多く (24^6) の組み合わせが得られ、ある時点でより大きなシーケンスの使用を妨げるものは何もありません。数字や大文字を使用できる場合は、短いシーケンスを使用できます。
変換のアルゴリズムは、基数変換 (16 進数に変換する場合と同様) であり、ゼロを表す記号でパディングします。これは、変換のための Python コードです。
LOWER = [chr(x + ord('a')) for x in range(25)]
DIGITS = [chr(x + ord('0')) for x in range(10)]
MAP = DIGITS + LOWER
def i2text(i, l):
n = len(MAP)
result = ''
while i != 0:
c = i % n
result += MAP[c]
i //= n
padding = MAP[0]*l
return (padding+result)[-l:]
print i2text(0,4)
print i2text(1,4)
print i2text(12,4)
print i2text(36,4)
print i2text(400000,4)
print i2text(1600000,4)
結果:
0000
0001
000c
0011
kib9
4b21
URL はhttp://mydomain.com/myapp/short/kib9の形式になります。
Google の短縮 URL を使用できます。Google には API があります。
そのためのドキュメントは次のとおりです。http://code.google.com/apis/urlshortener/v1/getting_started.html