単純なURL短縮スクリプトを作成しています。URLをハッシュして一意のIDとして機能させたいのですが、MD5のようなものを使用した場合、URLはそれほど短くなりません。
彼らのいくつかのハッシュ関数は、とにかく4桁または5桁の長さの一意のIDを作成するためのものですか?
単純なURL短縮スクリプトを作成しています。URLをハッシュして一意のIDとして機能させたいのですが、MD5のようなものを使用した場合、URLはそれほど短くなりません。
彼らのいくつかのハッシュ関数は、とにかく4桁または5桁の長さの一意のIDを作成するためのものですか?
ハッシュは衝突を引き起こします。自動インクリメント値を使用するだけです。これには、英数字を使用して圧縮することも含まれます。これが、ほとんどのURL短縮機能の仕組みです。
以下のniklasの答えは素晴らしく行われます。
自動インクリメント整数を使用し、すべての文字(小文字と大文字)で構成される識別子に変換して短縮します。
function ShortURL($integer, $chr='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') {
// the $chr has all the characters you want to use in the url's;
$base = strlen($chr);
// number of characters = base
$string = '';
do {
// start looping through the integer and getting the remainders using the base
$remainder = $integer % $base;
// replace that remainder with the corresponding the $chr using the index
$string .= $chr[$remainder];
// reduce the integer with the remainder and divide the sum with the base
$integer = ($integer - $remainder) / $base;
} while($integer > 0);
// continue doing that until integer reaches 0;
return $string;
}
そしてそれらを整数に戻すための対応する関数:
function LongURL($string, $chr='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') {
// this is just reversing everything that was done in the other function, one important thing to note is to use the same $chr as you did in the ShortURL
$array = array_flip(str_split($chr));
$base = strlen($chr);
$integer = 0;
$length = strlen($string);
for($c = 0; $c < $length; ++$c) {
$integer += $array[$string[$c]] * pow($base, $length - $c - 1);
}
return $integer;
}
MD5(または同等の方法)を使用する利点は、可能性の数が非常に多いため、すべての実用的な目的で、値が一意であると想定できることです。4桁のランダムなIDが一意であることを確認するには、既存のIDを追跡するデータベースが必要になります。
基本的に、IDを繰り返し生成し、DBと照合する必要があります。
MD5の最初の5文字はいつでも保持できます。すでに存在する場合は、ランダムな値をurl-stringに追加し、一意の値が得られるまで再試行します。
コードをコピーして実行したところ、文字列関数が逆になっているようです。shorturlで生成された番号を入力し、考え直して別の番号を取得しました。そこで、番号をデコードしたところ、上記の現在のコーディングとは逆に、文字列を長いURLにフィードバックする必要があることがわかりました。