在PHP中使用sprintf生成代码

时间:2011-11-14 07:20:52

标签: php

我想用这种模式生成一个串行密钥:

DA-7470-20762

这就是我到目前为止所做的:

$code = strtoupper(md5(uniqid(microtime(true), true)));
$uuid = sprintf("%02s-%04o-%04o",
    $code[0].$code[1],
    $code[2].$code[3].$code[4].$code[5],
    $code[6].$code[7].$code[8].$code[9]
);

但是我想阻止像这样的串行密钥:

AB-0000-0001

我需要删除所有0,因为它们是如此具有预测性。

有没有办法为像[1-9]这样的八进制sprintf设置范围?

2 个答案:

答案 0 :(得分:1)

我可能会按照以下方式处理:

printf('%2s-%4o-%4o',
       chr(mt_rand(65, 70)) . chr(mt_rand(65, 70)),
       mt_rand(01000, 07777),
       mt_rand(01000, 07777));

答案 1 :(得分:1)

如果您只是想要一种最小化零的方法,您可以选择按照以下伪代码的方式进行预生成序列修改:

for each idx in 2, 4, 6 and 8:
    if code[idx] == "0":
        code [idx] = randomNumBetween("1","7")