【发布时间】:2011-01-29 04:42:27
【问题描述】:
uniqid() 函数返回一个 13 位长的十六进制数。根据spec in php.net site,函数使用microtime生成唯一值。
但microtime 以字符串格式返回数字,如下所示:
"0.70352700 12689396875"
基本上是微秒和自 1970 年以来经过的秒数。 这是一个 9+11 位的十进制数。
将 20 位十进制数转换为十六进制会导致 16 位十六进制而不是 13 位。
我也想过去掉“0”。似乎永远不会改变的部分,以及似乎始终保持“00”的微秒部分的最后两位数字。这样做,十进制数只有 9+11-3 位长,但仍然将 17 位十进制数转换为十六进制会导致 14 位十六进制数不是 13。
我对以其他方式获得唯一 ID 或更长/更短的唯一 ID 不感兴趣!我只是问是否有人知道为什么 uniqid 只返回 13 位数字。
似乎很废话:如果uniqid返回的结果比microtime少一位,这意味着microtime给出的结果比uniqid返回的结果更独特。
【问题讨论】:
-
你应该使用 more_entropy 选项,它会给你一个更独特的结果。
-
不需要更多唯一性,我需要知道为什么结果只有 13 个字符长。无论如何感谢您的建议。
-
微时间中最重要的部分根本不经常出现。因此,当您尝试在几毫秒内生成两个唯一的字符串时,它们毫无用处。下周的所有时间戳都将从 126 开始。而且,如果您设法在同一微秒内调用 uniqid() 两次(无论是在两个不同的线程中还是在两个不同的服务器中),您会发现它的结果不会很独一无二。
-
如果你真的想知道为什么它是 13 个字符,下载并阅读源代码。
-
@Powerlord:我必须全部写成大写粗体,因为每个人都在回答我的问题,向我解释获得唯一 ID 的其他方法。我只是想让它更清楚。