1

ユーザーがボタンを押すと一意の5文字の値が返されるImgurに似た保存システムを実装したいと思います。これが私がこれまでに持っているものです:

データベースバックエンドは、で始まる自動インクリメントIDを使用します5308416。これらの数値IDを文字に変換するために、変更された基数関数(以下を参照)を使用します。逆関数を使用して、文字IDを数値データベースIDに戻します。

function genID (value)
{
    var alphabet = "23456789BCDFGHJKLMNPRSTVWXYZbcdfghjkmnpqrstvwxyz";

    var result = "";
    var length = alphabet.length;

    while (value > 0)
    {
        result = alphabet[value % length] + result;
        value  = Math.floor (value / length);
    }

    return result;
}

問題は、これらの生成されたIDが非常に予測可能であるということです。私の質問は、生成されたIDをランダムに見えるが、それでも一意に見えるようにするにはどうすればよいですか(データベースで番号として検索できるようにするため)。暗号化アルゴリズムを使用することを考えていましたが、どこから始めればよいかわかりませんでした。任意のヘルプや提案をいただければ幸いです(おそらくこれを行うためのより良い方法もあります)。

4

2 に答える 2

1

両方の方法で実行できる必要がありますか(つまり、整数をハッシュに変換してから元に戻す)?ハッシュを保存し、その方法でコンテンツを検索できる場合は、推測が難しいが完全なハッシュ空間を生成する関数を作成するのは比較的簡単です。素数を使用して、すべての可能な順列が使い果たされた場合にのみ繰り返されるシーケンスを生成します。

次のPHPの例は、私自身のコードからのものであり、このサイトから採用されています。

function hash($len = 6) {
    $base = 36;
    $gp = array(1,23,809,28837,1038073,37370257 /*,1345328833*/);
    $maxlen = count($gp);
    $len = $len > ($maxlen-1) ? ($maxlen-1) : $len;
    while($len < $maxlen && pow($base,$len) < $this->ID) $len++; 
    if($len >= $maxlen) throw new Exception($this->ID." out of range (max ".pow($base,$maxlen-1).")");
    $ceil = pow($base,$len);
    $prime = $gp[$len];
    $dechash = ($this->ID * $prime) % $ceil;
    $hash = base_convert($dechash, 10, $base);
    return str_pad($hash, $len, "0", STR_PAD_LEFT);
}

これをJavaScriptで実装するのは簡単ですが、理想的には必要ありません。テーブルに、そのアルゴリズムの結果をハッシュフィールドに入力する挿入トリガーがあります(もちろん、SQLに適合しています)。

于 2012-08-15T02:06:15.797 に答える
0

サーバー側の自動インクリメント番号を現在の日付/時刻ナゲットまたは乱数と組み合わせることで、予測不可能ですが一意のIDを作成できます。サーバー側の自動インクリメント番号は一意性を保証し、日付/時刻ナゲットまたは乱数は予測可能性を排除します。

サーバー側の一意の番号を入力として受け取り、クライアントに日付/時刻ナゲットを追加する文字列形式の一意のIDの場合、次のように実行できます。

function genID(serverNum) {
    return(serverNum + "" + (new Date).getTime());
}

または乱数を使用する:

function genID(serverNum) {
    return(serverNum + "" + Math.floor(Math.random() * 100000));
}

ただし、サーバーに日付/時刻要素を追加し、その一意のID全体をデータベースに保存するのが最適な場合があります。

于 2012-08-15T02:50:45.763 に答える