我想知道是否有人知道为表格的主键创建唯一随机整数id的好方法。我正在使用MySQL。该值必须是整数。
答案 0 :(得分:13)
响应: “因为我想使用该值来编码到Base62,然后将其用于网址中的ID。如果我自动增加,则可能很明显用户如何生成url id。“
如果您的目标是安全性,那么使用Base62,即使使用“随机”生成的数字也无济于事。
更好的选择是:
AUTO_INCREMENT
答案 1 :(得分:9)
如果您愿意接受建议并且可以实施,请使用UUID。
MySQL的UUID()
函数将返回36个字符值,可用于ID
。
如果你想使用整数,我认为你需要创建一个你将在getRandID()
语句中使用的函数INSERT
。此函数需要使用现有ID的随机+检查来返回之前未使用的。
检查MySQL的RAND()
函数。
答案 2 :(得分:7)
如何生成unique_ids是一个有用的问题 - 但是当你生成它们时,你似乎正在对进行反效果假设!
我的观点是,您在创建行时不需要生成这些唯一ID,因为它们基本上与所插入的数据无关。
我所做的是预先生成唯一ID以供将来使用,这样我就可以享受自己的美好时光并绝对保证它们是独一无二的,并且在插入时无法完成任何处理。
例如,我有一个带有order_id的订单表。当用户输入订单时,会立即生成此ID,永久递增1,2,3等。用户无需查看此内部ID。
然后我有另一个表 - unique_ids with(order_id,unique_id)。我有一个每天晚上运行的例程,它会为此表预加载足够多的unique_id行,以覆盖可能在接下来的24小时内插入的订单。 (如果我在一天内获得10000份订单,我就会遇到问题 - 但这将是一个很好的问题!)
这种方法保证了唯一性,并且可以将任何处理负载从插入事务转移到批处理例程中,而不会影响用户。
答案 3 :(得分:2)
这种方法(PHP
和MySQL
):
<强>短强>
number
user_id (UNIQUE)
number
的行插入user_id
看起来很重?继续阅读。
<强>长强>:
表:
users (user_id int UNIQUE)
代码:
<?php
// values stored in configuration
$min = 1;
$max = 1000000;
$numberOfLoops = 0;
do {
$randomNumber = rand($min, $max);
// the very insert
$insertedRows = insert_to_table(
'INSERT INTO foo_table (user_id) VALUES (:number)',
array(
':number' => $randomNumber
));
$numberOfLoops++;
// the magic
if (!isset($reported) && $numberOfLoops / 10 > 0.5) {
/**
* We can assume that at least 50% of numbers
* are already in use, so increment values of
* $min and $max in configuration.
*/
report_this_fact();
$reported = true;
} while ($insertedRows < 1);
$min
,$max
,0.5
)仅供参考,并且没有统计意义。insert_to_table
和report_this_fact
不是用PHP构建的。这些数字也只是为了澄清解释目的。答案 4 :(得分:0)
有AUTO_INCREMENT
功能。我会用那个。
请参阅here个更多示例。
答案 5 :(得分:0)
答案 6 :(得分:0)
function hexstr2decstr($hexstr){
$bigint = gmp_init($hexstr, 16);
$bigint_string = gmp_strval($bigint);
return $bigint_string;
}
function generate_64bitid(){
return substr(md5(uniqid(rand(), true)), 16, 16);
}
function dbGetUniqueXXXId(){
for($i = 0; $i < 10; $i++){
$decstr = hexstr2decstr(generate_64bitid());
//check duplicate for mysql.tablexxx
if($dup == false){
return $decstr;
}
}
return false;
}
答案 7 :(得分:0)
您可以为表使用AUTO_INCREMENT
,但为用户提供加密版本:
encrypted_id:SELECT HEX(AES_ENCRYPT(id, 'my-private-key'));
id:SELECT AES_DECRYPT(UNHEX(encrypted_id), 'my-private-key');