【问题标题】:PHP: generating unique string [duplicate]PHP:生成唯一字符串[重复]
【发布时间】:2012-06-17 04:24:25
【问题描述】:

可能重复:
PHP: How to generate a random, unique, alphanumeric string?

我正在尝试生成唯一 ID(字母数字字符串)。我为此使用了当前时间戳。我有两个问题:

  1. 如果stamp1 != stamp2md5(stamp1) 将不同于 md5(stamp2)
  2. 有没有生成唯一字符串的通用方法?

PS:最简单的原因就是以stamp为id。我仍然不希望很容易找出 id 是如何生成的

【问题讨论】:

标签: php string


【解决方案1】:

使用散列函数永远不会真正唯一,但您可以将另一个更接近的字符串组合在一起,即获取它们的 IP 地址并附加请求微时间,如下所示:

$strUnique = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR'])) . floor(microtime(true) * 1000);

为了不唯一,两个访问者必须在完全相同的微秒内从相同的 IP 地址加载页面,这比两个哈希值相等的可能性更大。

【讨论】:

    【解决方案2】:
    1. 是的,在大多数情况下,它们会有所不同。哈希冲突的可能性非常非常低(想想十亿分之一)。

    2. 内置函数uniqid() 非常适合此功能。您甚至可以使用md5(uniqid()),但请注意,这不会增加 GUID 的熵。为了增加熵,你可以这样调用函数:uniqid('',TRUE);

    【讨论】:

      【解决方案3】:

      我完全同意 xbonez 的回答,但我想补充一点,这取决于您使用它的用途,因为还有其他一些注意事项。

      • 如果这是针对数据库 id,您通常可以依靠数据库系统的自动增量或其他唯一键功能来生成 id
      • 如果这是用于文件名,请改用tempnam
      • 您可能希望在 md5 中同时使用时间戳和随机数,因为可以想象多个用户可能会在同一个时间戳上点击页面

      【讨论】:

      • 对于第三个问题,另一种解决方法是为uniqid() 提供前缀,例如用户的 ID 或他的 IP 地址的一部分。
      • 事实上,如果rand()是通过时间戳播种的,那么在同一时间戳访问的两个用户会收到相同的随机数。
      猜你喜欢
      • 2011-09-24
      • 2012-09-04
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多