【问题标题】:create unique string in php with base_convert and limited length在 php 中创建具有 base_convert 和有限长度的唯一字符串
【发布时间】:2017-02-06 15:45:00
【问题描述】:

我需要一个长度最大为 6 且混合了数字和字母的字符串。我检查了:

How can I make short random unique keys, like YouTube video IDs, in PHP?

PHP generate a unique string

这非常有用,但他们制作长度为 10 - 12 的字符串。我的问题是这段代码的输出是否总是唯一的?

base_convert(microtime(false), 6, 36);

base_convert(uniqid('test',true), 6, 36);

注意:我从基数 6 转换,但输入显然不会是基数 6。我这样做是因为如果从 10 转换为 36,它会产生 10-12 的长度。

【问题讨论】:

  • 我认为这根本行不通,因为您正在尝试从基数 6 转换,但输入显然不会是基数 6
  • @apokryfos 是的,我愿意。我这样做是因为如果我从 10 转换为 36,它会产生 10-12 的长度。我该怎么办?
  • 但是以 6 为底意味着数字都在 0-5 之间,但事实并非如此。你应该改为substr
  • @apokryfos 是的,但我认为如果使用 substr 它永远不会是唯一的
  • 保证唯一性是非常昂贵的。在绝大多数情况下获得独特的东西是大多数人的选择。即使是生成 GUID(应该是全局唯一标识符)的算法也只能以高概率生成唯一的。

标签: php string unique microtime


【解决方案1】:

简短回答:不,但如果您正在做一些很小的事情,例如个人网站,或者很少有人使用的内部专用工具,那就可以了。

长答案:如果您尝试做一些安全的事情,或者使用共享数据库的多个服务器,绝对不会。如果您依赖微时间,攻击者可以准确计算出他们的请求需要多长时间才能到达您的服务器并用他们的请求轰炸它,直到您的服务器生成重复的 ID。 uniqid 函数不保证返回 uniq 值(直接来自 php 手册),如果您使用 NTP 更新时间并将您的时间调整到 5 秒前,肯定会生成重复的 ID。

【讨论】:

  • 我怎样才能让它变得更好?
  • 制作独特的东西最简单的方法是使用计数器进行原子操作。最简单的方法是使用 SQL 数据库,并依靠它们自动递增的 ID,因为它们已经处理了所有可能的事情。如果你不想使用数据库,你可以在文件系统上创建一个文件来存储一个简单的整数。您将需要实现独占文件锁定、锁定等待和锁定释放。阅读php.net/manual/en/function.flock.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多