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

author author     2023-05-02     145

关键词:

在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);

如何在java中随机生成一个serialVersionUID?

】如何在java中随机生成一个serialVersionUID?【英文标题】:howdoIrandomlygenerateaserialVersionUIDinjava?【发布时间】:2020-11-0404:03:59【问题描述】:每当我看到这行代码时privatestaticfinallongserialVersionUID=它后面总是跟着一些长序列号..这个... 查看详情

如何在 Python 中有效地生成具有随机斜率和截距的直线?

】如何在Python中有效地生成具有随机斜率和截距的直线?【英文标题】:HowtoefficientlygenerateastraightlinewithrandomslopeandinterceptinPython?【发布时间】:2014-10-1419:04:11【问题描述】:考虑一个非常基本的直线y=m*x+b的蒙特卡罗模拟,例如... 查看详情

在java中随机生成一个无序且长度不大于10的字符串

 packagexiangmu;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.Random;publicclassTestCollection{/**通过定义Collections.sort()方法对String泛型进行List排序*创建一个String 查看详情

如何正确地生成一个随机数(代码片段)

参考文章笔记|如何正确地生成一个随机数CF曾提到:Don’tuserand():aguidetorandomnumbergeneratorsinC++文章总结:1.rand()的随机范围太小了,在某些平台下(例如Windows)RAND_MAX只有32768。如果需要的范围大于32768ÿ... 查看详情

如何最好地为网站生成随机盐?

】如何最好地为网站生成随机盐?【英文标题】:HowbesttogeneratearandomsaltforaWebSite?【发布时间】:2010-09-2415:07:14【问题描述】:我想生成一个随机盐值并将其放入应用程序状态。现在,我使用的是网络农场,因此每台机器的应用... 查看详情

如何生成保存到数组中的随机字符串? c# [重复]

】如何生成保存到数组中的随机字符串?c#[重复]【英文标题】:HowcanIgenerateRandomstringswhicharesavedintoanarray?c#[duplicate]【发布时间】:2020-07-3118:17:38【问题描述】:如何生成保存到数组中的随机字符串?在语言c#中所以我想生成保存... 查看详情

java中如何生成随机数

  Java中提供了一个获取随机数的一个类(Math)  Math:此类在java.lang包下,jvm会自动导入,所以无需import导包  生成随机数要使用Math类下的方法:random()  方法的返回值是[0.0-1.0)  1.获取上述范围内的随机数:  doub... 查看详情

在c语言中如何固定字符的长度

在C语言中如何固定字符的长度主要就是产生固定个数的随机字符,那么就简单了,用两组随机数:一组:随机产生0~25的整数num,然后用'a'+num来赋值小写字母,'A'+num来赋值大写字母一组:随机产生0,1,产生0,用'... 查看详情

随机数组生成器 Java

...个介于0和51之间的随机数,并为其分配一个字符值。我将如何解决这个问题或为 查看详情

如何将随机生成的整数存储到字符串中?

】如何将随机生成的整数存储到字符串中?【英文标题】:howtostorerandomgeneratedintegersintostring?【发布时间】:2012-10-0821:01:21【问题描述】:我有一个函数可以在(0,1)之间生成15个整数。如何将这些生成的整数存储到字符串中并将它... 查看详情

如何在java程序中写一个方法可随机生成12位数字,且永远不会重复,唯一的。

参考技术A//1-3的整数intn=(int)(math.random()%3)+1;其中(int)(math.random()%3)生成一个[0,2]之间的数据,然后加1实现平移到1-3建议阅读我写的随机数字控制的文章:http://blog.csdn.net/mailbomb/archive/2009/03/11/3981177.aspx 查看详情

java-如何在指定的值范围内生成一个随机的十六进制值

】java-如何在指定的值范围内生成一个随机的十六进制值【英文标题】:java-howtogeneratearandomhexadecimalvaluewithinspecifiedrangeofvalues【发布时间】:2012-06-2103:06:45【问题描述】:我在javaweb应用程序中有一个场景,其中必须生成一个随机... 查看详情

如何使用 Java 在 PostgreSQL 中安全地转义 SQL 的任意字符串

】如何使用Java在PostgreSQL中安全地转义SQL的任意字符串【英文标题】:HowtosafelyescapearbitrarystringsforSQLinPostgreSQLusingJava【发布时间】:2012-04-0205:29:18【问题描述】:我有一个特殊情况,要求我从用户提供的输入值生成SQLWHERE子句的... 查看详情

在Java中生成字母数字随机字符串[重复]

】在Java中生成字母数字随机字符串[重复]【英文标题】:GeneratingAlphanumericrandomstringinJava[duplicate]【发布时间】:2013-08-0619:48:41【问题描述】:我正在使用另一个答案中的字符串生成器,但除了字母/数字、没有空格、标点符号等... 查看详情

如何在Java中生成随机字符串[重复]

】如何在Java中生成随机字符串[重复]【英文标题】:HowtogeneratearandomStringinJava[duplicate]【发布时间】:2011-02-2106:34:13【问题描述】:我有一个名为Student的对象,它有studentName、studentId、studentAddress等。对于studentId,我必须生成由七... 查看详情

在一个范围内生成一个随机数。无溢出。在 Java 中

】在一个范围内生成一个随机数。无溢出。在Java中【英文标题】:Generatingarandomnumberwithinarange.WithoutOverlflow.InJava【发布时间】:2014-05-1800:33:51【问题描述】:请不要将此视为与以下内容的重复:Howtogeneraterandompositiveandnegativenumbers... 查看详情

生成仅包含指定字符的指定长度的随机字符串(在 Java 中)

】生成仅包含指定字符的指定长度的随机字符串(在Java中)【英文标题】:Generatearandomstringofspecifiedlengththatcontainsonlyspecifiedcharacters(inJava)【发布时间】:2012-06-1100:19:37【问题描述】:有没有人知道在Java中生成指定长度和字符的... 查看详情

在 Go 语言中生成固定长度的随机数

】在Go语言中生成固定长度的随机数【英文标题】:GeneratingfixedlengthrandomnumberinGolang【发布时间】:2018-06-1907:48:35【问题描述】:我需要在Golang中生成一个唯一的随机数。我有一个简单的ruby​​代码:(0...16).maprand(10).to_s.join所以... 查看详情