PHP/MySQL - 创建唯一随机字符串的最佳方法?

Joh*_*ohn 25 php mysql

如何在MySQL中创建随机唯一字符串?

当我需要在PHP中创建一个随机字符串时,我使用此函数:

public function generateString($length)
{   
    $charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    for($i=0; $i<$length; $i++) 
        $key .= $charset[(mt_rand(0,(strlen($charset)-1)))]; 

    return $key;
}
Run Code Online (Sandbox Code Playgroud)

然后我将获取生成的字符串并将其存储在MySQL数据库中.

确保生成的随机字符串对于为数据库中的其他条目创建的所有其他随机字符串是唯一的最佳方法是什么?

也许是这样的?

while(++$i < 100)
{
  //query db with random key to see if there is a match

  //if no match found break out of loop
  break;

}
Run Code Online (Sandbox Code Playgroud)

这看起来很乱,很长,我可能会多次打到数据库.如何快速确定我的新随机字符串是否唯一?

Mar*_*iek 17

为什么不使用内置函数生成唯一标识符?你不必担心这种重复.

PHP和MySQL都有自己的.

PHP: uniqid()

MySQL的: UUID()


Sal*_*n A 7

假设字符集中的10个字符a-z, A-Z, 0-9表示存在(26 + 26 + 10)10 = 8.39299366×10 17种可能的组合.计算碰撞的几率......只需1/x上述数字.所以我不会担心两次获得相同的字符串.即使再次获得相同的字符串,我也只是在循环中再次运行该函数,唯一的退出条件是找到一个唯一的字符串.

  • 您的碰撞概率并不严格正确 - 您正在计算1-1碰撞,而不是集合.对于小型集合,碰撞的可能性大致是"n(n-1)/ N",其中"n"是集合的大小,"N"是你的8.329x10 ^ 17.由此得出的结论是,碰撞的几率在大约"sqrt(N)"时变得不可忽略 - 这是10 ^ 8,所以如果你有很多(但不是完全不合理的大量)数据,你可能会发生碰撞.在这种情况下,最好的解决方案是稍微增加密钥长度,或者在使用该值之前进行检查. (3认同)