我对一个项目有需求
我们预计每月有数百万条记录添加到数据库中。
我在这里尝试过解决方案:PHP: How to generate a random, unique, alphanumeric string? 虽然它们一开始似乎有效,但我的测试表明随着时间的推移会有重复。
现在我正在考虑使用带有前缀的 uniqid。我发现使用没有前缀的 uniqid 的问题是,当同时请求同时进入服务器时,将生成重复项。我希望使用前缀可以解决这个问题。
我正在考虑使用这个功能:
private function generate_id()
{
$alpha_numeric = 'ABCDEFGHIJKLMNPQRSTUVWXYZ0123456789';
$max = strlen($alpha_numeric);
$prefix = '';
for ($i = 0; $i < 5; $i++)
{
$prefix .= $alpha_numeric[random_int(0, $max - 1)];
}
return strtoupper(uniqid($prefix));
}
前缀将是一个 5 个字符的字母数字字符串。这是否足以满足我的要求?
*****编辑*****
按照建议使用 UUID 将是限制碰撞机会的最佳方法,但已决定采用上述方法,但将前缀增加到 7 个字符。如果在同一毫秒内生成两个 ID,则发生冲突的几率约为 830 万分之一。上级认为这是可以接受的。
如果您使用 Composer 或外部库,请参阅https://github.com/ramsey/uuid
或者这个功能可以满足您的需求。根据您的需要strtoupper
,结果:
/**
* generate
*
* Returns a version 4 UUID
*
* @access public
* @return string
*/
public static function generate()
{
$data = openssl_random_pseudo_bytes(16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
$data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
见https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句