生成100萬個10位隨機字符串

需求是需要給數(shù)據(jù)庫mysql插入100萬個10位的隨機字符串犁跪,以后隨時從數(shù)據(jù)庫里獲取100-1000個值用于業(yè)務系統(tǒng)裂七。
10位隨機字符串可以使用的字符包括0-9和A-Z,任何語言都基本上有隨機函數(shù),生成10位隨機字符串很簡單嘀掸,但是怎么確保100萬條數(shù)據(jù)都不一樣材蹬。

效率最低但是最簡單的想法是插入一條前和現(xiàn)有的所有數(shù)據(jù)比較实幕,不一樣就插入,發(fā)現(xiàn)一樣就重新生成一個隨機值再比較堤器,時間復雜度是o(n!),很顯然對于100萬條數(shù)據(jù)來說這種算法是不可取的昆庇。

我們換一個思路,我先順序生成100萬條數(shù)據(jù)闸溃,然后隨機從100萬條數(shù)據(jù)里取100-1000條整吆,這樣生成數(shù)據(jù)的時間復雜度是o(n),效率高很多辉川,取隨機數(shù)據(jù)直接使用mysql帶的rand()函數(shù)掂为。以下是細節(jié):

1. 生成數(shù)據(jù)

順序生成100萬條數(shù)據(jù)的方法就是我們最簡單的排列組合,可選的字符是36個员串,字符串10位勇哗,則組合可能是 P(36, 10) ,如果我們用筆和紙的話寸齐,很容易寫出第一個到n個的數(shù)據(jù):

0000000000
0000000001
...
000000000A
000000000B
...
000000000Z
0000000010
0000000011
...

其本質其實是一個36進制的數(shù)一直在增值1,就是從最后一位開始欲诺,一直加抄谐,到9加1就到 A ,到 Z 之后再加1就開始進一位扰法。對應的算法代碼如下:

//36進制加一進位
private char[] systemAdd(char[] ss) {
    int LENGTH = 10;
    for (int i = LENGTH - 1; i >= 0; i--) {
        int temp = ss[i];
        int number9 = '9';
        int numberZ = 'Z';
        if (temp < number9 - 1) {
            ss[i] = (char) ((int) ss[i] + 1);
            break;
        } else if (temp == number9) {
            ss[i] = 'A';
            break;
        } else if (temp < numberZ) {
            ss[i] = (char) ((int) ss[i] + 1);
            break;
        } else {
            ss[i] = '0';
        }
    }
    return ss;
}

這里有一個細節(jié)就是 P(36,4)=36*35*34*33 的值就已經大于100萬了蛹含。我們如果按順序生成,只會用到后4位塞颁,前面6位全是0浦箱,為了避免最后生成的隨機字符串前6位都一樣,我們可以把前6位變成隨機值祠锣。


image.png
//100萬前6位都是0酷窥,所以把前6位改成隨機值
for (int j = 0; j < 6; j++) {
    int temp = ThreadLocalRandom.current().nextInt(36);
    ss[j] = all[temp];
}

2. 插入數(shù)據(jù)

我們肯定不能生成一條數(shù)據(jù)就插一次數(shù)據(jù)庫,100萬條數(shù)據(jù)分10組伴网,每組10萬條蓬推,我們也不能10萬條數(shù)據(jù)就生成10萬個 insert 語句,我們拼成一個 insert 語句澡腾,類似:

insert into tablename (cloumn1, column2) values 
                                  (c1_v1,c2_v1),
                                  (c1_v2,c2_v2),
                                  (c1_v3,c2_v3)

然后通過 JDBC 執(zhí)行 SQL 語句完成插入沸伏。基本的代碼如下:

void run() throws SQLException, ClassNotFoundException {
    long index = 0;
    long TOTAL = 1000000;
    //分組
    long PART = 100000;
    //分10個insert語句插入數(shù)據(jù)庫
    for (long i = 0; i < TOTAL / PART; i++) {
        StringBuffer sb = new StringBuffer();
        dbService.initInsertSQL(sb);
        for (long j = i * PART; j < (i + 1) * PART; j++) {
            index++;
            if (index > TOTAL) break;
            dbService.appendInsertSQL(index, String.valueOf(current), sb);
            current = systemAdd(current);
        }
        sb.deleteCharAt(sb.length() - 1);
        dbService.excute(sb.toString());
    }
}

最后測試一下动分,從生成到插入數(shù)據(jù)庫100萬條大概8秒毅糟,速度是可以接收的。

3. 獲取數(shù)據(jù)

從數(shù)據(jù)庫里獲取數(shù)據(jù)不需要再單獨寫算法了澜公,利用mysql的rand函數(shù)就可以留特。

SELECT * FROM random_values order by rand() limit 1000

但是要注意的是,獲取完需要把這1000條數(shù)據(jù)從表中刪除或加一個標記表示已用玛瘸,否則下次再獲取可能會重復蜕青。


image.png

完整源碼請參考 git

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市糊渊,隨后出現(xiàn)的幾起案子右核,更是在濱河造成了極大的恐慌,老刑警劉巖渺绒,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贺喝,死亡現(xiàn)場離奇詭異,居然都是意外死亡宗兼,警方通過查閱死者的電腦和手機躏鱼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殷绍,“玉大人染苛,你說我怎么就攤上這事。” “怎么了茶行?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵躯概,是天一觀的道長。 經常有香客問我畔师,道長娶靡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任看锉,我火速辦了婚禮姿锭,結果婚禮上,老公的妹妹穿的比我還像新娘伯铣。我一直安慰自己呻此,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布懂傀。 她就那樣靜靜地躺著趾诗,像睡著了一般蜡感。 火紅的嫁衣襯著肌膚如雪蹬蚁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天郑兴,我揣著相機與錄音犀斋,去河邊找鬼。 笑死情连,一個胖子當著我的面吹牛叽粹,可吹牛的內容都是我干的。 我是一名探鬼主播却舀,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼虫几,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挽拔?” 一聲冷哼從身側響起辆脸,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎螃诅,沒想到半個月后啡氢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡术裸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年倘是,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袭艺。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡搀崭,死狀恐怖,靈堂內的尸體忽然破棺而出猾编,到底是詐尸還是另有隱情门坷,我是刑警寧澤宣鄙,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站默蚌,受9級特大地震影響冻晤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜绸吸,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一鼻弧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锦茁,春花似錦攘轩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稿存,卻和暖如春笨篷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓣履。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工率翅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袖迎。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓冕臭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親燕锥。 傳聞我的和親對象是個殘疾皇子辜贵,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348