当您想要生成一个唯一的事务id或作为一个随机临时密码生成器,用户首次在网站上注册或创建防止自动输入的验证码时,通常需要生成随机的字符序列。
Java提供了许多不同的方法来编写随机字符串生成器应用程序,下面介绍几种方式。
UUID
UUID是由一组32位数的16进制数字所构成,故UUID理论上的总数为1632=2128,约等于3.4 x 1038。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。
java.util.UUID 类可用于生成UUID, 它的static randomUUID方法返回一个32个字符的字符串。
import java.util.UUID;
public class RandomStringGenerator{
<span class="hljs-function"><span >public</span> <span >static</span> <span >void</span> <span >main</span><span class="hljs-params">(String[] args)</span> </span>{
String randomString = usingUUID();
System.out.println(<span class="hljs-string">"Random string is: "</span> + randomString);
System.out.println(<span class="hljs-string">"Random string of 8 characters is: "</span>
+ randomString.substring(<span >0</span>, <span >8</span>));
}
<span class="hljs-function"><span >static</span> String <span >usingUUID</span><span class="hljs-params">()</span> </span>{
UUID randomUUID = UUID.randomUUID();
<span >return</span> randomUUID.toString().replaceAll(<span class="hljs-string">"-"</span>, <span class="hljs-string">""</span>);
}
}
注意randomUUID方法生成的字符串包含“-”。上面的示例通过使用空字符串替换了。
以上程序输出为:
Random string is: 923ed6ec4d04452eaf258ec8a4391a0f
Random string of 8 characters is: 923ed6ec
使用Math类
下面的算法可以使用这种方法生成一个固定长度的随机字符串。
- 初始化一个空字符串以保存结果。
- 创建大小写字母和数字的组合,以创建一组超级字符。
- 启动一个循环,该循环的count等于所需的随机字符串长度。
- 在每次迭代中,生成一个介于0和超集长度之间的随机数。
- 在步骤4中生成的数字索引处从步骤2中的字符串中提取字符,并将其添加到步骤1中的字符串中。
- 循环完成后,步骤1中的字符串将是一个随机字符串。
示例代码:
import java.util.Math;
public class RandomStringGenerator{
<span class="hljs-function"><span >public</span> <span >static</span> <span >void</span> <span >main</span><span class="hljs-params">(String[] args)</span> </span>{
String randomString = usingMath(<span >10</span>);
System.out.println(<span class="hljs-string">"Random string is: "</span> + randomString);
}
<span class="hljs-function"><span >static</span> String <span >usingMath</span><span class="hljs-params">(<span >int</span> length)</span> </span>{
String alphabetsInUpperCase = <span class="hljs-string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>;
String alphabetsInLowerCase = <span class="hljs-string">"abcdefghijklmnopqrstuvwxyz"</span>;
String numbers = <span class="hljs-string">"0123456789"</span>;
<span class="hljs-comment">// create a super set of all characters</span>
String allCharacters = alphabetsInLowerCase + alphabetsInUpperCase + numbers;
<span class="hljs-comment">// initialize a string to hold result</span>
StringBuffer randomString = <span >new</span> StringBuffer();
<span class="hljs-comment">// loop for 10 times</span>
<span >for</span> (<span >int</span> i = <span >0</span>; i < length; i++) {
<span class="hljs-comment">// generate a random number between 0 and length of all characters</span>
<span >int</span> randomIndex = (<span >int</span>)(Math.random() * allCharacters.length());
<span class="hljs-comment">// retrieve character at index and add it to result</span>
randomString.append(allCharacters.charAt(randomIndex));
}
<span >return</span> randomString.toString();
}
}
以上程序输出为:
Random string is: kqNG2SYHeF
Random string is: lCppqqUg8P
Random string is: GGiFiEP5Dz
这种方法使您能够更好地控制需要包含在随机字符串中的字符。例如,如果您不想要数字,那么就从超集中删除它们。如果您想要特殊字符,那么就在超集中添加一组特殊字符。
使用Random类
此方法与Math方法类似,即创建所有字符的超集,生成一个随机索引,并使用该索引处的字符创建最终字符串。
这种方法使用java.util.Random 类生成随机索引。
示例代码:
import java.util.Random;
public class RandomStringGenerator{
<span class="hljs-function"><span >public</span> <span >static</span> <span >void</span> <span >main</span><span class="hljs-params">(String[] args)</span> </span>{
String randomString = usingRandom(<span >10</span>);
System.out.println(<span class="hljs-string">"Random string is: "</span> + randomString);
}
<span class="hljs-function"><span >static</span> String <span >usingRandom</span><span class="hljs-params">(<span >int</span> length)</span> </span>{
String alphabetsInUpperCase = <span class="hljs-string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>;
String alphabetsInLowerCase = <span class="hljs-string">"abcdefghijklmnopqrstuvwxyz"</span>;
String numbers = <span class="hljs-string">"0123456789"</span>;
<span class="hljs-comment">// create a super set of all characters</span>
String allCharacters = alphabetsInLowerCase + alphabetsInUpperCase + numbers;
<span class="hljs-comment">// initialize a string to hold result</span>
StringBuffer randomString = <span >new</span> StringBuffer();
<span class="hljs-comment">// loop for 10 times</span>
<span >for</span> (<span >int</span> i = <span >0</span>; i < length; i++) {
<span class="hljs-comment">// generate a random number between 0 and length of all characters </span>
<span >int</span> randomIndex = random.nextInt(allCharacters.length());
<span class="hljs-comment">// retrieve character at index and add it to result</span>
randomString.append(allCharacters.charAt(randomIndex));
}
<span >return</span> randomString.toString();
}
}
以上程序输出为:
Random string is: TycOBOxITs
Random string is: 7LLWVbg0ps
Random string is: p6VyqdO6bT
您还可以使用java.util.SecureRandom类生成一个随机整数。它是java.util.Random的一个子类。
使用RandomStringUtils类
Apache Commons Lang库有一个org.apache.commons.lang.RandomStringUtils类,该类具有生成固定长度的随机字符串的方法。
它的方法可以生成只包含字母(随机字母)、数字(随机数字)或两者(随机字母数字)的随机字符串。
所有这些方法都接受一个整数参数,该参数表示它们将生成的字符串的长度。
示例代码:
import org.apache.commons.lang.RandomStringUtils;
public class RandomStringGenerator{
<span class="hljs-function"><span >public</span> <span >static</span> <span >void</span> <span >main</span><span class="hljs-params">(String[] args)</span> </span>{
<span class="hljs-comment">// generate a random string of 10 alphabets</span>
String randomString = RandomStringUtils.randomAlphabetic(<span >10</span>);
System.out.println(<span class="hljs-string">"Random string of 10 alphabets: "</span> + randomString);
randomString = RandomStringUtils.randomNumeric(<span >10</span>);
System.out.println(<span class="hljs-string">"Random string of 10 numbers: "</span> + randomString);
randomString = RandomStringUtils.randomAlphanumeric(<span >10</span>);
System.out.println(<span class="hljs-string">"Random string of 10 alphanumeric characters: "</span> + randomString);
}
}
以上程序输出为:
Random string of 10 alphabets: OEfadIYfFm
Random string of 10 numbers: 1639479195
Random string of 10 alphanumeric characters: wTQRMXrNY9
该类还有一个方法random,该方法接受一个整数(即要生成的字符串的长度)和一个char数组。生成的随机字符串仅由该数组中的字符组成。
通过根据构建工具添加以下依赖项,可以将Apache Commons Lang包含到您的项目中。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
希望这篇文章对你有所帮助。您知道其他随机字符串生成器方法吗?