在java语言中如何随机地生成一个字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java语言中如何随机地生成一个字符串相关的知识,希望对你有一定的参考价值。

在java语言中如何随机地生成一个字符串

可以配合UUID或者GUID来实现

GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。

UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID
import java.util.UUID;
public class Test
public static void main(String[] args)
UUID uuid = UUID.randomUUID();
System.out.println (uuid);


编译运行输出:
07ca3dec-b674-41d0-af9e-9c37583b08bb

两种方式生成guid 与uuid

需要comm log 库
/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;

public class RandomGUID extends Object
protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
.getLog(getClass());

public String valueBeforeMD5 = "";
public String valueAfterMD5 = "";
private static Random myRand;
private static SecureRandom mySecureRand;

private static String s_id;
private static final int PAD_BELOW = 0x10;
private static final int TWO_BYTES = 0xFF;

/*
* Static block to take care of one time secureRandom seed.
* It takes a few seconds to initialize SecureRandom. You might
* want to consider removing this static block or replacing
* it with a "time since first loaded" seed to reduce this time.
* This block will run only once per JVM instance.
*/

static
mySecureRand = new SecureRandom();
long secureInitializer = mySecureRand.nextLong();
myRand = new Random(secureInitializer);
try
s_id = InetAddress.getLocalHost().toString();
catch (UnknownHostException e)
e.printStackTrace();




/*
* Default constructor. With no specification of security option,
* this constructor defaults to lower security, high performance.
*/
public RandomGUID()
getRandomGUID(false);


/*
* Constructor with security option. Setting secure true
* enables each random number generated to be cryptographically
* strong. Secure false defaults to the standard Random function seeded
* with a single cryptographically strong random number.
*/
public RandomGUID(boolean secure)
getRandomGUID(secure);


/*
* Method to generate the random GUID
*/
private void getRandomGUID(boolean secure)
MessageDigest md5 = null;
StringBuffer sbValueBeforeMD5 = new StringBuffer(128);

try
md5 = MessageDigest.getInstance("MD5");
catch (NoSuchAlgorithmException e)
logger.error("Error: " + e);


try
long time = System.currentTimeMillis();
long rand = 0;

if (secure)
rand = mySecureRand.nextLong();
else
rand = myRand.nextLong();

sbValueBeforeMD5.append(s_id);
sbValueBeforeMD5.append(":");
sbValueBeforeMD5.append(Long.toString(time));
sbValueBeforeMD5.append(":");
sbValueBeforeMD5.append(Long.toString(rand));

valueBeforeMD5 = sbValueBeforeMD5.toString();
md5.update(valueBeforeMD5.getBytes());

byte[] array = md5.digest();
StringBuffer sb = new StringBuffer(32);
for (int j = 0; j < array.length; ++j)
int b = array[j] & TWO_BYTES;
if (b < PAD_BELOW)
sb.append('0');
sb.append(Integer.toHexString(b));


valueAfterMD5 = sb.toString();

catch (Exception e)
logger.error("Error:" + e);



/*
* Convert to the standard format for GUID
* (Useful for SQL Server UniqueIdentifiers, etc.)
* Example: C2FEEEAC-CFCD-11D1-8B05-00600806D9B6
*/
public String toString()
String raw = valueAfterMD5.toUpperCase();
StringBuffer sb = new StringBuffer(64);
sb.append(raw.substring(0, 8));
sb.append("-");
sb.append(raw.substring(8, 12));
sb.append("-");
sb.append(raw.substring(12, 16));
sb.append("-");
sb.append(raw.substring(16, 20));
sb.append("-");
sb.append(raw.substring(20));

return sb.toString();


// Demonstraton and self test of class
public static void main(String args[])
for (int i=0; i< 100; i++)
RandomGUID myGUID = new RandomGUID();
System.out.println("Seeding String=" + myGUID.valueBeforeMD5);
System.out.println("rawGUID=" + myGUID.valueAfterMD5);
System.out.println("RandomGUID=" + myGUID.toString());



参考技术A 我的想法是 先随机生成一个字符串的长度值 n
然后随机生成一些字符:
Random r = new Random();

int n = Math.abs(r.nextInt());
char s[] = new char[n];

for(int i = 0; i< n; i++)

s[i] = (char)r.nextInt(128);


String s1 = new String(s);

最后这个s1就是生成的随机字串
参考技术B 没明白..具体点呗? 参考技术C 这个是个简单的方法:
public static String getCharRandom(int length)
int[] array=new int[length];
char[] chars = new char[length];
for(int i = 0; i < length; i ++)
while (true)
array[i] = (int)(Math.random()*1000);
if ((array[i] > 64 && array[i] < 91) ||
(array[i] > 96 && array[i] < 123)) break;

chars[i] = (char) array[i];

return new String(chars);

C#中如何产生随机字符串

如何例用C#产生 A到Z 数字0到9 两种组和之间的随机字符串 要求是
第次不能重复 而且每次都要有 数字和字母两者 字数是 20位
我想要的是 两次产生 或是多次产生的串列 没有相同的 而不是单次里面没有重复的字符 但是一定要是数字和字母都有的 这样我想你搞起来会更简单吧 呵呵

loop:
List<string> strList = new List<string>();//创建一个存放A到Z,0到9的字符串列表
for (int i = 65; i <= 90; i++)

char aa =(char) i;
strList.Add(aa.ToString());//把A到Z放到列表中

char[] number=new char[10];//把0到9字符存入字符数组中
for (int i = 48; i <= 57; i++)

char aa = (char)i;
strList.Add(aa.ToString());//把A到Z放到列表中
number[i-48]=aa;


string resultStr = "";//你要的字符串
for (int i = 0; i < 20; i++)

Random random = new Random();
int index = random.Next(strList.Count);
resultStr = resultStr + strList[index];
strList.RemoveAt(index);


if (resultStr.IndexOfAny(number) == -1)//判断是否含有数字,没有则重新生成字符串

goto loop;//跳到上面


这样产生的字符串,字符不会有重复的。而且一定会有两字符和数字的。
我已经调试过了,你看看结果。
我运行的结果是:768543210ZYXWVUTSRQ9
参考技术A public string CreateCheckCode()

char[] CharArray = 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9';
string sCode = "";
Random random = new Random();
for (int i = 0; i < 20; i++)

sCode += CharArray[random.Next(CharArray.Length)];

return sCode;


补充:你定义一个集合(Collection),用于保存两次生成的sCode
参考技术B private int rep = 0;

private string GenerateCheckCode()

string str = string.Empty;
long num2 = DateTime.Now.Ticks + this.rep;
this.rep++;
Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> this.rep)));
Random r = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> this.rep)));
int n = r.Next(6, 11);
for (int i = 0; i <n; i++)


char ch;
int num = random.Next();

if ((num % 2) == 0)

ch = (char)(0x30 + ((ushort)(num % 10)));

else

ch = (char)(0x41 + ((ushort)(num % 0x1a)));

str = str + ch.ToString();


return str;

生成5-10个字符之间的随机字符串。

以上是关于在java语言中如何随机地生成一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

C语言 如何随机生成字符串

如何用java随机生成一个字母

在C语言中怎样产生随机的字符串

JAVA中 如何产生一个特定范围的随机数

Java如何得到随机数的第5个值

用C#产生随机字符窜