2017-02-06 23 views
0

我需要一个字符串,最大长度为6,数字和字母组合。我查了一下:在php中使用base_convert创建唯一字符串并限制长度

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长度。

+0

我不认为这会工作,因为你试图从基地6转换,但输入显然不会是基地6 – apokryfos

+0

@apokryfos 是的,我这样做。我这样做,因为如果我从10转换到36它产生10-12长度。 我该怎么办? –

+0

但基数6意味着数字将全部在0-5之间,但情况并非如此。你应该做一个['substr'](http://php.net/manual/en/function.substr.php) – apokryfos

回答

1

简答:不,但是如果你正在做一些像个人网站一样小的东西,或者只有很少的人使用的内部工具,那么它会好的。

长答案:绝对不是,如果你想要做一些安全的事情,或者使用多个共享数据库的服务器。攻击者可以计算出请求到达服务器所需的时间,并根据请求对请求进行轰击,直到服务器根据microtime生成重复的ID。 uniqid函数不能保证返回uniq值(直接从PHP手册),并且如果您使用NTP更新您的时间并且它将您的时间调整为5秒前,肯定会生成重复的ID。

+0

我该如何做得更好? –

+0

使独特的东西最简单的方法是与计数器进行原子操作。最简单的方法是使用SQL数据库,并依靠自动增加的ID,因为它们已经处理了所有可能的事情。如果你不想使用数据库,你可以在文件系统上创建一个文件来存储一个简单的整数。您将需要实现独占文件锁定,锁定等待和锁定释放。阅读http://php.net/manual/en/function.flock.php – Dimi