【问题标题】:is there an issue with this php unique id generator?这个 php 唯一 ID 生成器有问题吗?
【发布时间】:2012-05-20 11:21:20
【问题描述】:

此代码是我计划用于生成门票唯一代码的代码。

// A prefix to avoid uniqid collisions (when invoking this function at the same time).
// Should I use mt_rand or just rand?
$prefix = str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);

// uniqid with more entropy enabled.
$unique_id = uniqid("$prefix-", TRUE);

// A SHA-1 hash for the generated code, this way it looks less sequential.
$unique_id = sha1($unique_id);

如果你能告诉我这段代码中的问题会更有帮助。

提前致谢。

【问题讨论】:

  • Afaik 你不需要添加前缀来避免冲突。为什么?因为您也可以在前缀中发生冲突! uniqid() 发生碰撞的可能性已经很低,您无需担心。此外,通过使用哈希函数(将无限集映射到有限集)对其进行哈希处理,您会引入很高的冲突机会。
  • 补充:我可能需要纠正一下自己。显然,多个主机仍然可以在同一微秒内产生相同的uniqid。但是你可以只使用主机名作为前缀。

标签: php code-generation sha1


【解决方案1】:

这要看需求,是不是必须是无人能猜到的超级机密字符串?

如果没有,假设您也将门票存储在数据库中,您可以使用$unique_id = sha1(DATABASE_KEY);

echo sha1(1) . "\n";
echo sha1(2) . "\n";
echo sha1(3) . "\n";

See the example.

现在你已经有了一个长而有趣的字符串,你甚至不需要存储它。

【讨论】:

  • 但如果不可预测性是必需的,仍然很容易猜到。简单的整数彩虹表很容易生成。一个简单的固定盐会有很大帮助
  • @Marc B 当然,这就是为什么我说这取决于要求。
  • 问题是我要求生成的代码不可猜测,因为这个信息是在使用票时使用的。如果有人能猜到密码,他可以免费协助活动。
  • @sanrodari:然后在哈希中添加盐,一些随机字母数字字符串加上数据​​库 ID 号。使用适当的盐,几乎不可能弄清楚你是如何生成哈希的,并且会相当安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多