生成可读的随机唯一ID

时间:2015-03-24 14:40:15

标签: php unique

我需要生成唯一的交易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的样子,只要它是独一无二的,相对容易引人注目或重新输入。

2 个答案:

答案 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;。

https://github.com/ramsey/uuid