我需要生成唯一的交易ID。系统允许数字,字母,连字符和下划线,但不是句号。
我目前使用的功能是,
generate_id() {
$id = uniqid('P_', true);
$id = str_replace('.', '-', $id);
return $id;
}
示例输出:
P_551171d3dd8a93-57457934
但是,我最近发现(a)uniqid()
不一定是唯一的,并且(b)我的客户偶尔需要重新输入这些ID,比较它们,搜索它们等等。当前的ID是不太可读,难以眼球。 (我原以为这些只是付费API中的内部使用。我最近才意识到客户实际上正在阅读这些内容。)
所以我想改变这个,
function generate_id() {
$s = '';
for ($i = 0; $i < 5; $i++) {
if ($s) {
$s .= '-';
}
$s .= bin2hex(openssl_random_pseudo_bytes(2));
}
return $s;
}
示例输出:
ced7-1cef-5331-193c-907d
openssl_random_pseudo_bytes()
是推荐的生成随机唯一标识符的方法,但我担心这样做四次并且整理(我只是因为这是分割它的最简单方法)为便于阅读而使用连字符)可能会危及它。我应该生成一个长字符串,然后操纵它来添加连字符吗?
或者,确实,我应该完全做其他事情吗?我真的不介意交易ID的样子,只要它是独一无二的,相对容易引人注目或重新输入。
答案 0 :(得分:2)
连续多次调用openssl_random_pseudo_bytes
应该不是问题。无论您是读取一长串随机字节还是许多短随机字节串并不重要,它们仍然是随机的。我仍然会将此代码更改为此,因为它更简单:
join('-', str_split(bin2hex(openssl_random_pseudo_bytes(40)), 4))
这个几乎已经是UUID,所以你可能真的想要使用其中一个。虽然随机字节应,但UUID明确地设计为全局唯一,具有足够高的概率,您根本不需要在实践中担心它。使用http://pecl.php.net/package/uuid或您的替代首选实施。
答案 1 :(得分:0)
使用UUID。它可以由uniqid()和自定义算法或使用库形成。如果您使用UUID进行冲突,&lt;在这里插入随机大量礼物&gt;。