4

可能重复:
PHP:如何生成随机、唯一的字母数字字符串?

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

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

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

4

3 回答 3

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

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

于 2012-06-14T06:44:02.407 回答
3

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

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

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

于 2012-06-14T07:45:22.427 回答
2

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

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