2010-11-23 10 views
3

私はURLの短縮に取り組んでいます。入力はURLであり、出力は4文字の文字列(英数字、大文字と小文字を区別する)でなければなりません。設定長さのURLのための良いハッシュ関数をPHPで短く設計する

大文字と小文字を区別する英数字のキースペースで4文字を使用すると、スペースがなくなるまで、64^4(16777216)のURLを格納できる可能性があるはずです。

また、私のURL短縮ツールが、攻撃的な4文字の短いURLを生成しないようにしたいと思います。誰かがdomain.com/f**kという短いURLを作ってしまったのは残念です。あなたは写真を手に入れます...

これについての最善の方法は?私は、プロセスのどこかでbase64_encodeを使用しているような気がします。

答えて

3

私があなたの場合、大文字と小文字を区別する英数字のインクリメンタを使用します。インクリメントして、番号をデータベース行に割り当てます。悪い単語をチェックするには、ブラックリストをチェックしてください。それが通過すれば、素晴らしい。そうでない場合は、もう一度インクリメントしてください。

このように、ハッシュアルゴリズムではなく、順番に並んでいます。最初の数は次のようになります。

id | url 
------------------------- 
0000 | http://google.com 
0001 | http://yahoo.com 
0002 | http://example.com 
... 
000a | http://mail.google.com 
000b | http://adobe.com 
... 
000A | http://microsof.com 
... 
0010 | http://w3.org 
... 
00a0 | http://youtube.com 
... 
00A0 | http://stackoverflow.com 

などです。ここで

は機能が動作する方法についてのヒントです: http://us3.php.net/manual/en/function.ord.php

ところで、私の数学が間違っているかもしれませんが、私はそれは(10 + 26 + 26)だと思います^ 4 = 14776336

編集 :楽しみと挑戦のために、私はインクリメンタ関数を書きました。最大値に達するとfalseを返しますので、使用時にfalseと比較します(===付き)。

http://pastebin.com/957KPn4p

+0

ヘイジョナ - これはとても素晴らしいです!あなたの優れた反応に感謝します。 –

+0

これらの値の1つを受け取り、それが表す整数を蹴飛ばす関数に関する考えはありますか? =] –

+0

私はそれについて考えることができました...なぜですか?データベースインデックスについて考えるなら、その番号をそのまま使用することができます。 – Jonah

関連する問題