从auto_increment主键生成字母数字id

时间:2012-08-02 12:41:50

标签: php mysql

在我的表中,我插入了用户的新记录(新用户)。我有一个int设置为字段主键。我想要的是使这个id安全。因为这个id公开给大家。任何用户或人都可以看到此ID。

如果我生成的id是这样的:

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

其他人很容易猜到它,因为ID的顺序是增加1.相反,我想在一个单独的字段中存储一个“公共”id,这是该auto_increment主id的aplhanumeric表示。

所以在数据库中,表格将是这样的:

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

我考虑过使用哈希。但哈希是40或更高的固定长度。但我希望公共ID的长度固定为10个字符。应该是唯一的,如果可能的话,我更喜欢从id

生成它

请告诉我们如何创建这个?任何帮助我这样做的内置函数?


我通过hash()了解了crc32 functionhttp://www.php.net/manual/en/function.hash.php#104987它将提供8个char长度哈希值。它将来会发生冲突吗?

测试:

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

5 个答案:

答案 0 :(得分: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 );
  }
?>

答案 1 :(得分:0)

试试这个

MySql auto-incrementing Alpha-numeric primary key?

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

或者

composite (alphanumeric) primary key and auto increment

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;
    }

答案 2 :(得分:0)

您可以尝试从原始ID中随机播放字符和XOR。

答案 3 :(得分:0)

生成哈希并取前10个字母。

检查数据库中是否已存在此类ID。 如果不是,您可以将其作为您的ID,否则生成新哈希并重试。

如果您想表示您的真实身份证,您可以选择一个分隔符,并将您的身份证号码映射到信件。

示例:

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

X是用于将映射的ID与随机生成的部分分开的分隔符。

2映射到B

1映射到A

答案 4 :(得分:0)

没有内置功能可以为你做到这一点,所以我担心你必须自己建一个。如果您不受10个字符要求的限制,请查看UUID。这篇文章:PHP function to generate v4 UUID将解释如何创建一个将在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;
}