6

サイトで「グループ」を作成すると生成される、5文字または6文字の短い招待コードを作成しようとしています。グループ情報はグループテーブルに保存されます。グループへの参加を希望するユーザーは、招待コードを持っている必要があります。他のことを知っている必要はありません。

もちろん、招待コードは一意である必要があり、再確認せずに一意の文字列を生成したいと思っていますが、コードを理解するのは困難でした。私は何十ものSOの質問と回答を読んでいます。これは私が思いついたものです:

名前などのグループ情報をグループテーブルに挿入すると、当然、行には一意の自動インクリメントIDが与えられます。

1)そのIDを取得します

2)1234に追加します

3)チーム名をbase36からbase10に変換した後、値を並べて配置します。「NewYorkYankees」はbase10(3994055806027582482648)[1263399405580602758248264820130221060827])

4)ベース36に変換

5)データベースにコードを挿入します

これはすべてのグループに固有であることが保証されていますよね?衝突の可能性はゼロですか?それはまったくランダムではないので、私はこれを言います。私は何かユニークなものから始め、それをユニークに保ち、ランダムなデータを導入することは決してありません。

ただし、グループ名は繰り返し可能であるため、作成/挿入時に行IDを取得するにはどうすればよいですか?これは機能しませんが、私がいる場所です:

$query = "SELECT id FROM groups WHERE gname = :gname";
...
$uid = $result + '1234';
$hex = md5(":gname NOW()" . uniqid("$uid", true));
base_convert($hex, 10, 36);
intval($str, 36);

$query = "INSERT...";

ユニークで短いですが、ユーザーが利用できないすべての適切な部分がないと予測できません。

4

3 に答える 3

2

ここでは、最後に挿入されたauto_increment値を取得する方法について説明します。

IDを取得したら、秘密鍵を使用したAESのような対称鍵暗号化を使用する必要があります。一意であることが保証されています(元の平文に戻すことができるため、復号化と呼ばれます)。

ブロックサイズを調整して、目的の長さ(ビット単位)を取得できます。base64では、長さは4の倍数になります(8ビット文字がトリプレットでエンコードされるため、base64では4文字のブロックになります)。

于 2013-02-21T13:01:43.980 に答える
2
$query = "INSERT INTO groups (gname, gadmin) VALUES (:gname, :gadmin)";
    $query_params = array( ':gname' => $trimmed['gname']
                           ':gadmin' => $userid );

    try {
        $stmt = $db->prepare($query);
        $result = $stmt->execute($query_params);
        $gid = $db->lastInsertId();
    }
    catch(PDOException $ex) {
        die("Failed to run query: " . $ex->getMessage());
    }

    // Use this library: https://github.com/ivanakimov/hashids.php
    $hashids = new Hashids\Hashids('this is my constant salt', 5,
                'abcdefghijklmnpqrstuvwxyz0123456789');

    $hash = $hashids->encrypt($gid);

    $query = "UPDATE groups SET invite = '$hash' WHERE id = '$gid'";
    ...

問題のライブラリは、手間のかかる作業を処理します。それ自体は実際にはハッシュされません。入力を暗号化します。私の行IDは一意であるため、暗号化された結果も一意です。「ハッシュ」を復号化する必要はありませんが、オプションはあります。長さを厳密に定義することはできませんが、最小値を設定して、拡張する余地を残すことができます。また、ご覧のとおり、「アルファベット」も定義できます。

于 2013-02-21T13:24:15.003 に答える
0

グループを作成した人のIPアドレスまたはユーザーID、ミリ秒を含む時間を連結してから、公開する文字列を生成するMD5またはSHA-256を連結してみませんか?それは確かに予測不可能であり、繰り返されないでしょう。

于 2013-02-21T12:46:21.277 に答える