【问题标题】:PHP Random String Generator without Repeats无重复的 PHP 随机字符串生成器
【发布时间】:2011-11-20 18:48:22
【问题描述】:

我正在尝试编写一个 PHP 函数,该函数将生成“假定”随机字符串,无论运行多少次,这些字符串都必须是唯一的。好吧,它可以运行多次以生成,但最好不要多次。

例如,当您将图像上传到 imgur 时,它会生成一个随机的 5 字母 [a-zA-Z] 字符串。如果我想复制这个(在 MySQL 数据库中存储带有唯一键的字符串),而不必重复选择并确保键不存在,有什么办法吗? 同时,随机的重要性确实存在,所以我宁愿不使用 1,2,3 (aaaaa,aaaab,aaaac),因为这将完全消除对随机性的需求。

我知道有 52^5 种不同的可能性,但仅出于教育目的(以及未来的算法编写),有没有一种有效的方法来生成这些“唯一”“随机”字符串?

[编辑] 我知道唯一+随机是(基本上)不可能的。但是有什么方法可以生成独特的、非显而易见的字符串吗?谢谢丹麦人!

【问题讨论】:

  • 你希望字符串有多长?如果可以处理 40 个字符串,则可以使用 SHA1,从冲突的角度来看,它是一种安全算法。另外,字符串中可以包含哪些字符?也只有字母或数字。

标签: php string random unique generator


【解决方案1】:

这取决于时间,因此不太可能带来重复。

$randString = date("Ymdhis") . rand(10000, 99999);

虽然有点长。

【讨论】:

    【解决方案2】:

    我找到的一个简单方法:

    $charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $rand_str = '';
    $desired_length = 10;
    while(strlen($rand_str) < $desired_length)
      $rand_str .= substr(str_shuffle($charset), 0, 1);
    

    ...或...

    $desired_length = 10;
    echo base64_encode(openssl_random_pseudo_bytes($desired_length));
    

    您还应该阅读two more methods to generate random string using php

    【讨论】:

      【解决方案3】:

      当您随机生成任何数据时,您无法保证唯一性。

      您只有生成重复的概率,具体取决于随机化算法和随机数据可能性的数量。

      这通常是非常低的关注。

      但是如果你想保证唯一性,你有两种方法:

      1. 搜索先前生成的结果并丢弃重复项(这是您的 MySQL 方法)
      2. 使用一些您知道是唯一的值,并将该值附加/预先附加到随机数据中,例如对于 Web 应用程序,您可以使用 IP Address of requesterrequest time,这保证生成唯一数据,因为两个用户不能同时拥有相同的 IP 地址

      【讨论】:

      • 本质上就是这样;我最好的选择是编写一个“真正的”随机化算法,并且碰撞不太可能因此忽略它们?
      • @Edward 在你的情况下,我会采用我描述的第二种方法。请参阅我的更新答案。至于随机化算法,我会使用uniqidmt_rand 作为基础。
      • 从技术上讲,同一网络上的 2 个用户(想想办公室 LAN)甚至一台机器上的 2 个选项卡或来自一个浏览器的 2 个 ajax 调用将具有相同的 IP 并且可能具有相同的时间。
      猜你喜欢
      • 2015-08-16
      • 2011-05-20
      • 1970-01-01
      • 2017-04-05
      • 2010-12-07
      • 1970-01-01
      • 2013-10-01
      相关资源
      最近更新 更多