Php 向数据库发送随机数,因为它';身份证

Php 向数据库发送随机数,因为它';身份证,php,Php,我正在尝试向数据库发送一个随机数以获取用户/文章ID。它当前使用自动递增作为计数系统。然而,我希望这个数字是随机的和不可预测的 PHP中的mt_rand()函数正是我所需要的。尽管如此,我的问题是当函数返回一个已经在使用的数字时会发生什么。当然,我可以使用is_null()来检查。但如果它继续选择一个使用中的数字,我可以想象这会减慢操作速度 有没有想过我能做些什么来解决这个问题?也许我在这方面完全错了 此外,如果有一个功能,提供字母和数字,这也将非常有帮助(如Youtube的) 谢谢你的阅读 您

我正在尝试向数据库发送一个随机数以获取用户/文章ID。它当前使用自动递增作为计数系统。然而,我希望这个数字是随机的和不可预测的

PHP中的mt_rand()函数正是我所需要的。尽管如此,我的问题是当函数返回一个已经在使用的数字时会发生什么。当然,我可以使用is_null()来检查。但如果它继续选择一个使用中的数字,我可以想象这会减慢操作速度

有没有想过我能做些什么来解决这个问题?也许我在这方面完全错了

此外,如果有一个功能,提供字母和数字,这也将非常有帮助(如Youtube的)


谢谢你的阅读

您应该始终使用自动增量字段作为数据库的主键。不这样做会使您的性能降低很多。您当然可以使用随机ID创建一个辅助ID字段。我可能会使用哈希函数来获得随机字符串的最佳机会:

<?php $key = md5(rand(0,999).time().$myItemTitle); // ex. ce4075a3d3f6fd757eb6dd44810cbe14
出于性能原因,您应该始终(在正常使用情况下)使用自动递增的ID。如果你的目的是为了能够在某种程度上隐藏下一篇文章,因为有人可能会猜测它,那么你最好在数据库中添加某种哈希唯一字段。

始终随机(仅加密ms):


下面是一个创建10个字符长字符串的简单函数。字符串是使用大小写文本和数字构建的。自动递增肯定是一种方式,但是,如果你是死板的,下面的函数应该会有所帮助

<?php

function randomID()
{
    $ID = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,10);
    echo $ID;
}

randomID();

?>

要使字符串变长,请将10更改为任意值。在确保它不存在方面。我建议您生成新的ID,然后在数据库中进行搜索,以确保在插入之前它不存在。虽然这是一个额外的步骤,但不幸的是,这是需要做的


希望这对您有所帮助

您真正想要的是一些“随机”键,用作文章的标识符。我会保持自动增量和更高:

  • 添加一个带有“hashkey”或“random key”的列来标识文章。这就提出了“我已经有了这个关键”的问题(除非你有几十亿篇文章,否则这个问题不应该太大)。请参阅已经发布的一些代码示例
  • 创建一个带有预生成键(即10000 id->键值)的额外表,您可以在其中按键查找id。如果表格用完,您可以轻松生成新值。这样,您就不必担心生成速度“慢”

  • 如果有一个函数可以给出字母和数字
    -
    函数foo(){return'abc123';}
    -你的问题,正如它目前写的那样,是模糊的。为了得到更准确的答案,请详细解释你试图完成的任务。使用长随机字符串而不是数字。那么发生碰撞的可能性很低。有关如何生成随机字符串的信息,请参阅。@AmalMurali例如,它不只是向数据库发送数字,而是发送字母和数字。以随机顺序。像这样(-QV8irCGmOE)唯一性不是随机性的属性。你想完成什么?只是记录中难以猜测的字符串?可能会为此生成一个GUID?我将主键保留为auto_increment,并将其设置为secondary,然后使用secondary从数据库中提取文章。这还会影响速度吗?
    Egttu2XhRGdAiXVfszscWg
    
    XlttfR3XaL6pym1uSNY7Kg
    
    YvoKCweUnN8gZyodRYysLA
    
    <?php
    
    function randomID()
    {
        $ID = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,10);
        echo $ID;
    }
    
    randomID();
    
    ?>