php 中的短唯一 ID
2022-08-30 10:14:11
我想创建一个唯一的ID,但给出类似.我想要的是类似于tinyurl给出的东西:.越短越好。唯一的要求是它不应该有一个明显的顺序,它应该看起来比一个看似随机的数字序列更漂亮。字母优先于数字,理想情况下不会是混合大小写。由于条目的数量不会那么多(最多10000个左右),因此碰撞的风险不是一个很大的因素。uniqid()
'492607b0ee414'
'64k8ra'
任何建议都值得赞赏。
我想创建一个唯一的ID,但给出类似.我想要的是类似于tinyurl给出的东西:.越短越好。唯一的要求是它不应该有一个明显的顺序,它应该看起来比一个看似随机的数字序列更漂亮。字母优先于数字,理想情况下不会是混合大小写。由于条目的数量不会那么多(最多10000个左右),因此碰撞的风险不是一个很大的因素。uniqid()
'492607b0ee414'
'64k8ra'
任何建议都值得赞赏。
创建一个小函数,返回给定长度的随机字母:
<?php
function generate_random_letters($length) {
$random = '';
for ($i = 0; $i < $length; $i++) {
$random .= chr(rand(ord('a'), ord('z')));
}
return $random;
}
然后,您需要调用它,直到它是唯一的,在伪代码中,具体取决于您存储该信息的位置:
do {
$unique = generate_random_letters(6);
} while (is_in_table($unique));
add_to_table($unique);
您可能还需要确保字母不会在字典中形成单词。可能是整个英语词典,或者只是一个坏词词典,以避免客户发现不好的味道。
编辑:我也会补充说,这只有在你打算使用它的情况下才有意义,因为它不适合大量的项目,因为你可能会得到更多的冲突(获取表中已有的ID)的速度会变得非常慢。当然,您需要一个索引表,并且需要调整 ID 中的字母数以避免冲突。在这种情况下,对于6个字母,您将有26 ^ 6 = 308915776个可能的唯一ID(减去坏单词),这应该足以满足您10000的需求。
编辑:如果你想要字母和数字的组合,你可以使用以下代码:
$random .= rand(0, 1) ? rand(0, 9) : chr(rand(ord('a'), ord('z')));
@gen_uuid() by gord.
preg_replace遇到了一些令人讨厌的utf-8问题,这导致uid有时包含“+”或“/”。要解决这个问题,你必须明确地使模式utf-8
function gen_uuid($len=8) {
$hex = md5("yourSaltHere" . uniqid("", true));
$pack = pack('H*', $hex);
$tmp = base64_encode($pack);
$uid = preg_replace("#(*UTF8)[^A-Za-z0-9]#", "", $tmp);
$len = max(4, min(128, $len));
while (strlen($uid) < $len)
$uid .= gen_uuid(22);
return substr($uid, 0, $len);
}
我花了很长时间才发现,也许它节省了其他人的头痛