从自增主键生成字母数字ID

3
在我的表中,我插入了新用户的记录。我有一个整数字段作为主键。我想让这个ID更加安全,因为这个ID是向所有人公开的。任何用户或者人都可以看到这个ID。
如果我生成的ID像这样:
0000000001
...
0000000023
...
0000000157
...

由于id是按1递增的顺序存储的,因此很容易被其他人猜到。为避免这种情况的发生,我希望在一个单独的字段中存储一个“公共”id,该字段是此自动递增的主键的字母数字表示形式。

因此,在数据库中,表将如下所示:

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

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

请告诉我如何创建这个?是否有任何内置函数可以帮助我实现?


我了解了hash() 函数crc32http://www.php.net/manual/en/function.hash.php#104987它将给出8个字符长度的哈希。以后会有冲突吗?

测试:

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

只需生成一个随机的10个字符长的字符串,直到您拥有一个尚未在表中的字符串,然后将其用作生成的ID。 - yent
1
ID 公开有什么问题吗?SO 对此没有任何问题。 - ypercubeᵀᴹ
用于创建身份证的代码 - Vpp Man
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 );
  }
?>

使用以下代码:echo hash('crc32', '0000000001'); // 输出 6c13f76e,是否正常? - Vpp Man
但是哈希很容易被解密,甚至有很多网站可以像http://www.hash-cracker.com/和http://www.md5decrypter.co.uk/这样解密哈希。 - user1280616

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

这样使用可以吗? echo hash('crc32', '0000000001'); // 输出 6c13f76e - Vpp Man

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

这样使用可以吗:echo hash('crc32', '0000000001'); // 输出6c13f76e - Vpp Man
哈希只是对ID进行加密,理论上可以被解密。如果您的优先级是使ID随机且唯一,则哈希不是正确的工具,在我看来。 - Kasia Gogolek

0

你可以尝试对字符进行洗牌并从原始ID进行异或操作。


这样使用可以吗? echo hash('crc32', '0000000001'); // gives 6c13f76e - Vpp Man

0

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

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

如果您想表示您的真实ID,您可以选择一个分隔符字母并将您的ID映射到字母。

例如:

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

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

2被映射为B

1被映射为A


使用这个可以吗:echo hash('crc32', '0000000001'); // 输出 6c13f76e - Vpp Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接