java commons lang 随机数_Apache Common-lang组件里随机数工具类RandomStringUtils的一个bug...
現在本文也轉到了我自己的博客上,地址:月城小館
Apache?Common組件是java開發中常用的工具,其中的common-lang包是java基本數據類型的處理工具,包括數字、字符串、日期時間等多種工具類。
在org.apache.commons.lang包中有一個隨機數工具類RandomStringUtils,它是根據指定的字符串數組生成給定長度的隨機數的工具類。該累包含較多的方法,所有方法返回的都是隨機數字符串。每個方法至少提供一個參數int?count,這個參數表示要生成的隨機數的長度,最后真正實現這個隨機數生成過程的是下面這個方法:
publicstaticStringrandom(intcount,intstart,intend,
booleanletters,booleannumbers,char[]?chars,?Random?random)?{
if(count?==?0)
return"";
if(count?
thrownewIllegalArgumentException(
"Requested?random?string?length?"+?count
+"?is?less?than?0.");
}
if((start?==?0)?&&?(end?==?0))?{
end?=?123;
start?=?32;
if((!(letters))?&&?(!(numbers)))?{
start?=?0;
end?=?2147483647;
}
}
StringBuffer?buffer?=newStringBuffer();
intgap?=?end?-?start;
while(count--?!=?0)?{
charch;
if(chars?==null)
ch?=?(char)?(random.nextInt(gap)?+?start);
else{
ch?=?chars[(random.nextInt(gap)?+?start)];
}
if(((letters)?&&?(numbers)?&&?(Character.isLetterOrDigit(ch)))
||?((letters)?&&?(Character.isLetter(ch)))
||?((numbers)?&&?(Character.isDigit(ch)))
||?((!(letters))?&&?(!(numbers))))
buffer.append(ch);
else{
++count;
}
}
returnbuffer.toString();
}
其中的參數:
@paramcount表示要生成的隨機數長度
@paramstart開始位置
@paramend結束位置
@paramletters是否包含字母
@paramnumbers是否包含數字
@paramchars指定的字符種子
@paramrandomRandom實例
看代碼里面的邏輯很清楚了,別的參數不做討論,只看chars這個參數。
(1)如果指定了這個參數,則生成的隨機數只能包含這個數組里的字符(字符或者數字);
(2)如果沒有指定這個數組,傳進來的是null,則根據指定的start和end給出隨機數,然后在后面的while循環里判斷,見紅色字體部分。
使用下面這個語句進行調用:
String?strLen?=?RandomStringUtils.random(2,?6,?11,?false,?true);
這個語句最終調用的還是上面說的那個方法,執行時是死循環狀態,問題就出在這里(2)的情況里,如果指定參數letters為false,參數numbers為true,指定的start和end在可見字符之外,比如start=6,end=11,則紅色標志部分的代碼判斷一直為false,造成while進入死循環狀態。
為避免這種情況產生,需要在傳遞參數時小心謹慎,給出合法的起止位置,最好給出字符串數組,指定該方法使用給定的字符生成隨機數;或者對這個方法進行完善,定義自己的隨機數工具類。
總結
以上是生活随笔為你收集整理的java commons lang 随机数_Apache Common-lang组件里随机数工具类RandomStringUtils的一个bug...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 iOS 16.4 beta 改进“
- 下一篇: java文件读写详细介绍_java文件读