如何生成数千万不重复的固定长度的字符串?

发布于 2022-08-31 09:27:04 字数 223 浏览 12 评论 0

字符串有a-z,0-9组成。

假设需要生成5000w个这样的串(比如长度为10),在生成过程中,如何保证字符串不会重复呢?要求生成的结果具有一定的随机性,不能让人简单的猜出。
比如下面的不符合要求:
aaaaaaa,aaaaaab,aaaaaac...... zzzzzzzzb
希望是这样的串:
hd7g0d48

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

情释 2022-09-07 09:27:04

保证不会重复最简单的方法就是建立一一映射,映射的一边是0~5000w,另一边是10位字符串也就是 pow(36, 10),一个简单的做法就是标志位+大数表异或,原理参考另一个回答,这里直接贴实现

http://jsfiddle.net/y6ewhyqu/

因为JS的二进制运算似乎只支持到32位,所以这里只生成到0x7FFFFFFF,大约是36进制的6位,需要10位的话可以做两次(准备不同的两份大数表),或者后四位填充md5 crc之类的,算的时候舍去都行

记忆で 2022-09-07 09:27:04

推荐UUID

function guid(){
    if (function_exists('com_create_guid')){
        return com_create_guid();
    }else{
        mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);// "-"
        $uuid = chr(123)// "{"
                .substr($charid, 0, 8).$hyphen
                .substr($charid, 8, 4).$hyphen
                .substr($charid,12, 4).$hyphen
                .substr($charid,16, 4).$hyphen
                .substr($charid,20,12)
                .chr(125);// "}"
        return $uuid;
    }
}
空城旧梦 2022-09-07 09:27:04

嘛暂时弄个伪代码吧- -
i=0
字符串s=[]
for i从0到生成数量
字符串s push ( (sha256(i) 格式hex) substr(0,长) )

离线来电— 2022-09-07 09:27:04
function generateRandomString($length = 10,$num) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($j=0;$j<$num;$j++){
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        $randomString .= "<br/>";
    }

    return $randomString;
}

可以在这个方法上在进行优化一下,加上日期时间戳之类。

亣腦蒛氧 2022-09-07 09:27:04

md5(time().rand(10000,9999999));

旧伤还要旧人安 2022-09-07 09:27:04

我问了一个朋友,他提供一个思路。
10个字符串,前5个从00000到zzzzz递增,后5个随机。这样的10个字符串肯定不会重复。

长度较小,比如6,7等,这样的数还是容易发现规律的。

小…楫夜泊 2022-09-07 09:27:04

首先 毫秒级的时间戳是必须的 然后一切可以随机的东西都可以拿来用 包括某些拿汇编得到的数据
最后就是加上伪随机码
还是一点 我感觉10位的长度还是不够 太短了 你去看看那些网游的点卡都是多长的

突然想到一点 这种东西最重要的就是预警机制 比如连续输错几个 就封禁ip15分钟内不准再输了 同时提供预警机制告诉有人来试你的充值系统了

你就算再长能顶得住点正的人么 彩票那么难中不还有中500万的

老街孤人 2022-09-07 09:27:04

加上time()时间戳 然后HASH 就可以避免重复了吧

祁梦 2022-09-07 09:27:04

$part1 = base_convert(str_replace("-", "", str_replace(".", "",strval(microtime(true))).strval(SlString::getHashCode(md5(strval(uniqid(rand(), true)))))), 10, 32);
$part2 = sprintf('%04x%04x%04x%04x%04x%04x%04x%04x', mt_rand(0,65535),mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384,20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535),mt_rand(0,65535));
$guid = substr($part1 . $part2, 0, 32);
return $guid;

余罪 2022-09-07 09:27:04

写数据库,唯一索引,写不进去$i减1。

落在眉间の轻吻 2022-09-07 09:27:04

多随机一些,排序去重。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文