我在我的服务器上使用PHP函数uniqid()。它应该像微缩时间一样。所以我认为它是唯一的FOR ONE服务器。这是对的吗?
如果使用负载均衡器扩展我的服务器,如何获得唯一ID?我需要一个少于31个字符的字符串。
由于
答案 0 :(得分:2)
对于作为第一个参数传递的每个服务器,您可以对uniqid()
使用不同的前缀。 Check the documentation
string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )
prefix
例如,如果您生成标识符,则可能很有用 同时在几个主机上 可能碰巧生成了 标识符在相同的微秒 使用空前缀,返回 字符串长度为13个字符。如果 more_entropy为TRUE,它将为23 字符。
示例:
$serverId = str_replace('.', '', $_SERVER["SERVER_ADDR"].$_SERVER["SERVER_PORT"]);
$uid = substr(uniqid($serverId, true), 0, 30);
或者查看这个伟大的uuid()函数:http://cakebaker.42dh.com/wp-content/uploads/2007/01/uuid_component_2007-01-24.zip
答案 1 :(得分:2)
我建议组合多个熵源。这样你就不会依赖某些假设(本地IP地址不同)或运气(两台服务器不会在同一纳米时间完全相同)。
我想到的事情(并且非常便携,而不是特定于平台):
毕竟你可以使用它作为一些散列函数的输入,只是为了规范化为30字节的字符串(例如输入值为strval()
的md5sum的最后30个字节)。
答案 2 :(得分:1)
是的,正如其manual page所说,它基于当前时间(以微秒为单位)。
您可以使用prefix
参数传入特定于主机的前缀。
即使使用more_entropy
参数,前缀仍有7个字符,允许256 ** 7个主机。
答案 3 :(得分:0)
您应该将前缀设置为唯一字符串(每个服务器对您的系统都是唯一的)。示例可以是主机名或IP地址。保持少于17个字符(如果使用额外的熵,则为7个字符)。
答案 4 :(得分:-1)
尝试
$uid = uniqid($serverId, true);
这将为每个$uid
添加前缀$serverId
。