2

私のテーブルに、ユーザーの新しいレコード(新しいユーザー)を挿入します。フィールドの主キーとして int を設定しています。私が欲しいのは、このIDを安全にすることです。このIDは誰にでも公開されているためです。すべてのユーザーまたは人がこの ID を表示できます。

私が生成するIDが次のような場合:

0000000001
...
0000000023
...
0000000157
...

ID は 1 ずつインクリメントされる順序であるため、他の人が推測するのは簡単です。代わりに、この auto_increment プライマリ ID の英数字表現である別のフィールドに「パブリック」ID を格納したいと考えています。

したがって、データベースでは、テーブルは次のようになります。

id------------------public_id
---------------------------------
0000000001 -------- W3UB3VNAU3222
0000000002 -------- 7BNXYO28CN2KK

ハッシュを使用することを考えました。ただし、ハッシュは 40 以上の固定長です。しかし、公開IDの長さを10文字に固定したいです。一意である必要があり、可能であれば、から生成することを好みますid

これを作成する方法を教えてください。これを行うのに役立つ組み込み関数はありますか?


hash() 関数について次のように読みましたcrc32: http://www.php.net/manual/en/function.hash.php#104987 8 文字の長さのハッシュが得られます。将来的に衝突することはありますか?

テスト:

echo hash('crc32', '0000000001'); // gives 6c13f76e
4

5 に答える 5

0

次のコード例は、1桁を含む10文字の長さのランダムな文字列を生成します。

<?php
  function random_string( )
  {
    $character_set_array = array( );
    $character_set_array[ ] = array( 'count' => 10, 'characters' => 'abcdefghijklmnopqrstuvwxyz' );
    $character_set_array[ ] = array( 'count' => 1, 'characters' => '0123456789' ); //you can change count
    $temp_array = array( );
    foreach ( $character_set_array as $character_set )
    {
      for ( $i = 0; $i < $character_set[ 'count' ]; $i++ )
      {
        $temp_array[ ] = $character_set[ 'characters' ][ rand( 0, strlen( $character_set[ 'characters' ] ) - 1 ) ];
      }
    }
    shuffle( $temp_array );
    return implode( '', $temp_array );
  }
?>
于 2012-08-02T12:46:30.680 に答える
0

これを試して

MySql自動インクリメント英数字の主キー?

CREATE TABLE myItems (
    id INT NOT NULL AUTO_INCREMENT,
    prefix CHAR(30) NOT NULL,
    PRIMARY KEY (id, prefix),

または

複合 (英数字) 主キーと自動インクリメント

public function random_id_gen($length)
    {
        //the characters you want in your id
        $characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
        $max = strlen($characters) - 1;
        $string = '';

        for ($i = 0; $i < $length; $i++) {
            $string .= $characters[mt_rand(0, $max)];
        }

        return $string;
    }
于 2012-08-02T12:47:42.203 に答える
0

文字をシャッフルし、元の ID から XOR を試みることができます。

于 2012-08-02T12:49:59.917 に答える
0

それを行う組み込み関数はありませんので、自分で作成する必要があります。10 文字の要件に制限されていない場合は、UUIDをご覧ください。この投稿: v4 UUID を生成する PHP 関数では、PHP で UUID を生成する PHP 関数の作成方法について説明します。

それ以外の場合は、生成するたびに ID が一意かどうかを確認する必要がありますが、これらの行に沿って関数を試してください。

function generateID()
{
    $capital_letters = range("A", "Z");
    $lowcase_letters = range("a", "z");
    $numbers         = range(0, 9);

    $all = array_merge($capital_letters, $lowcase_letters, $numbers);
    $count = count($all);    
    $id    = "";

    for($i = 0; $i < 10; $i++)
    {
        $key = rand(0, $count);
        $id .= $all[$key];
    }

    if(!uniqueId($id))
    {
        return generateID();
    }
    return $id;
}
于 2012-08-02T12:56:17.197 に答える
0

ハッシュを生成し、最初の 10 文字を取得します。

そのような ID が既にデータベースにあるかどうかを確認してください。そうでない場合は、それを ID として取得できます。そうでない場合は、新しいハッシュを生成して、もう一度試してください。

真の ID を表現したい場合は、区切り文字を選択して、ID を文字にマッピングできます。

例:

ID:          ...0000021
PUBLIC_ID :  ...Hd3dXBA

X は、マッピングされた ID をランダムに生成された部分から分離するセパレーターです。

2 は B にマッピングされます

1 は A にマップされます

于 2012-08-02T12:52:59.477 に答える