2

単純なURL短縮スクリプトを作成しています。URLをハッシュして一意のIDとして機能させたいのですが、MD5のようなものを使用した場合、URLはそれほど短くなりません。

彼らのいくつかのハッシュ関数は、とにかく4桁または5桁の長さの一意のIDを作成するためのものですか?

4

5 に答える 5

3

ハッシュは衝突を引き起こします。自動インクリメント値を使用するだけです。これには、英数字を使用して圧縮することも含まれます。これが、ほとんどのURL短縮機能の仕組みです。

以下のniklasの答えは素晴らしく行われます。

于 2011-06-17T17:52:14.010 に答える
3

自動インクリメント整数を使用し、すべての文字(小文字と大文字)で構成される識別子に変換して短縮します。

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;


    }
于 2011-06-17T17:54:29.267 に答える
0

MD5(または同等の方法)を使用する利点は、可能性の数が非常に多いため、すべての実用的な目的で、値が一意であると想定できることです。4桁のランダムなIDが一意であることを確認するには、既存のIDを追跡するデータベースが必要になります。

基本的に、IDを繰り返し生成し、DBと照合する必要があります。

于 2011-06-17T17:53:22.407 に答える
0

MD5の最初の5文字はいつでも保持できます。すでに存在する場合は、ランダムな値をurl-stringに追加し、一意の値が得られるまで再試行します。

于 2011-06-17T17:54:54.293 に答える
0

コードをコピーして実行したところ、文字列関数が逆になっているようです。shorturlで生成された番号を入力し、考え直して別の番号を取得しました。そこで、番号をデコードしたところ、上記の現在のコーディングとは逆に、文字列を長いURLにフィードバックする必要があることがわかりました。

于 2011-07-17T08:05:54.393 に答える