在我的表中,我插入了用户(新用户)的新记录。我有一个int集作为字段主键。我想要的是确保这个身份证的安全。因为这对每个人都是公开的。任何用户或人员都可以看到此id。
如果我生成的id是这样的:
0000000001
...
0000000023
...
0000000157
...
另一个人很容易猜到,因为id的顺序是递增1。相反,我想将一个"public"id存储在一个单独的字段中,该字段是这个auto_increment主id的一个应用数字表示。
所以在数据库中,表将是这样的:
id------------------public_id
---------------------------------
0000000001 -------- W3UB3VNAU3222
0000000002 -------- 7BNXYO28CN2KK
我想过用哈希。但hash是一个固定长度为40或以上的值。但我希望公共id的长度固定为10个字符。应该是唯一的,如果可能的话,我更喜欢从id
生成它
请告诉我如何创建这个?有什么内置函数可以帮助我做到这一点?
我读到关于hash()
与crc32
的函数:http://www.php.net/manual/en/function.hash.php#104987它将给出8个字符长度的散列。将来会发生冲突吗?
测试:
echo hash('crc32', '0000000001'); // gives 6c13f76e
没有内置函数可以为您做到这一点,所以恐怕您必须自己构建一个。如果您不受10个字符要求的限制,请查看UUID。这篇文章:生成v4UUID的PHP函数将解释如何创建一个在PHP中生成UUID的PHP函数。
否则,请尝试使用这些行中的函数,尽管每次生成id时都必须检查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;
}
以下代码示例生成一个包含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 );
}
?>
尝试这个
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;
}
您可以尝试混洗字符并从原始id进行异或。
生成一个散列并取前10个字母。
检查这样的ID是否已经在您的数据库中。如果不是,你可以将其作为你的ID,否则生成一个新的哈希并重试。
如果你想代表你的真实身份,你可以选择一个分隔符字母,并将你的身份映射到字母。
示例:
ID: ...0000021
PUBLIC_ID : ...Hd3dXBA
X是将映射的ID与随机生成的零件分隔开的分隔符。
2被映射到B
1映射到