Java 生成任意位數永不重複的隨機數策略實現

2021-07-26 19:21:58 字數 2229 閱讀 6900

在專案中遇到客戶乙個需求,id的生成策略:長度8位,使用者在知道自己的id(如:10000018)後,不能通過id來推測相關資訊,如使用者可能推測我是第18個註冊使用者,上乙個註冊使用者的id是10000017,這樣就不能很好的保護賬號安全了,可以憑證推測資料來進行不法之事。

經過網上查詢和思考,便有了如下的解決方案:

邏輯很簡單,就看實現了,**如下:

生成id並儲存到硬碟

/**

* 生成1-99999999的數字編碼儲存到硬碟

*/private

static

void

int begin = 1;

int end = 99999999;

int count = begin + end;

//生成1到99999999的所有整數

int codes = new

int[count + 1];

for (int i = begin; i <= end; i++)

//隨機交換資料

int index = 0;

int tempcode = 0;

random random = new random();

for (int i = begin; i <= end; i++)

stringbuilder sb = new stringbuilder();

int flag = 100000;

system.out.println("***********開始**********");

try

if(i==end)

file file = new file("d:/idgenerate/id_"+(i/flag)+".txt");

if (!file.exists())

bufferedwriter bw=new bufferedwriter(new filewriter(file.getabsolutefile()));

bw.write(sb.tostring());

bw.flush();

bw.close();

sb = new stringbuilder();

system.out.println("當前i值:"+i+"第"+(i/flag)+"個檔案生成成功!");}}

system.out.println("***********結束**********");

} catch (ioexception e)

}

獲取id

//獲取唯一8位id

bufferedwriter bw = null;

bufferedreader br = null;

filereader fr = null;

filewriter fw = null;

try

file rootfile = new file(dir);

string filenames = rootfile.list();

if(filenames == null || filenames.length == 0)

//獲取第乙個檔案

fr=new filereader(dir+"/"+filenames[0]);//獲取檔案流

br = new bufferedreader(fr); //將流整體讀取。

stringbuilder sb = new stringbuilder();

string temp;

int count =1;

while(!stringutils.isblank(temp=br.readline()))

else

}br.close();

fr.close();

//判斷檔案內容是否還有下一行

if(sb.length()<=0)

}else

string prex = "00000000";

}else

} catch (exception e) finally catch (ioexception e)

}}

這樣將生成的id分成1000個檔案儲存到硬碟,取資料的時候從任意檔案中取都可,這樣能很好的保證了隨機,不重複,而且在測試的時候發現效率還不錯,記憶體,cpu的使用都微乎其微。

為了更好的優化獲取id效率,可以有如下改進:

隨機數生成(永不重複)

public class randomtreeutils char chars new char char chars new char int treedeeps chars.length int key 7 最多生成7位數 if treedeeps key 返回樹形 arraylist tree...

利用java生成不重複的ID

當不使用任何持久化框架時,需要想辦法來生成不重複的id,類似於hibernate的uuid。第一種方法 packagecom.hh.util 建立資料庫id的通用方法.since jdk1.6 publicclasscreateid return 隨機建立資料庫15位id return string...

不重複排列的生成

全排列的話比較好打。可,當乙個集合中有許多重複的元素,如 如何生成不重複的排列?易知答案只有乙個。生成不重複排列,這很實用。思想 把重複的數字不在看做多個元素,而是看做乙個元素的多個個數。然後遞迴生成時,新增在答案裡的是次數的減少。正確性 如果按照以上思路,那麼可以知道,每個因為我們把重複的元素當做...