如何为表的主键创建唯一的随机整数ID?

时间:2010-11-19 14:13:28

标签: mysql sql primary-key uniqueidentifier

我想知道是否有人知道为表格的主键创建唯一随机整数id的好方法。我正在使用MySQL。该值必须是整数。

8 个答案:

答案 0 :(得分:13)

响应: “因为我想使用该值来编码到Base62,然后将其用于网址中的ID。如果我自动增加,则可能很明显用户如何生成url id。“

如果您的目标是安全性,那么使用Base62,即使使用“随机”生成的数字也无济于事。

更好的选择是:

  • 不要重新发明轮子 - 使用AUTO_INCREMENT
  • 然后使用加密哈希函数+随机生成的字符串(隐藏在该特定网址的数据库中)生成该网址的最终“唯一ID”

答案 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)

这种方法(PHPMySQL):


<强>短

  1. number
  2. 生成随机user_id (UNIQUE)
  3. 将生成number的行插入user_id
  4. 如果插入的行数等于0,请转到第1点
  5. 看起来很重?继续阅读。


    <强>长

    表:

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

    1. 所有值($min$max0.5)仅供参考,并且没有统计意义。
    2. 函数insert_to_tablereport_this_fact不是用PHP构建的。这些数字也只是为了澄清解释目的。

答案 4 :(得分:0)

AUTO_INCREMENT功能。我会用那个。

请参阅here个更多示例。

答案 5 :(得分:0)

AUTO_INCREMENT将是您最好的选择。

Here就是一些例子。

如果需要,您可以调整增量值开始的位置(默认情况下为1)。

答案 6 :(得分:0)

我的方式,对于32位和64位平台。结果是64位

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');