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