如何自定义生成固定长度的字符串ID,8-12个字符
格式:业务标记_xxxxxxxxxx
如:user_Nuxq23s24dxa1ScSx
要求:1ms生成100W个
或有什么现成的库可以使用,麻烦老大们贴下代码
如何自定义生成固定长度的字符串ID,8-12个字符
格式:业务标记_xxxxxxxxxx
如:user_Nuxq23s24dxa1ScSx
要求:1ms生成100W个
或有什么现成的库可以使用,麻烦老大们贴下代码
在Java中生成分布式ID,常见的方法是使用UUID
,AtomicLong
,Snowflake
等库。
对于你的需求,这里有一种使用UUID的方式,可以生成满足你要求的字符串ID。UUID的长度是固定的128位,但我们只需要其中的一部分,所以可以将UUID按照一定的格式进行截断。以下是一种可能的实现:
import java.util.UUID;
public class IDGenerator {
public static String generateID(int length) {
String id = UUID.randomUUID().toString();
return id.substring(0, length);
}
}
这个类中的generateID
方法可以接受一个参数length
,用来指定生成的ID的长度。UUID.randomUUID().toString()
会生成一个128位的UUID,然后我们使用substring
方法截取其中的一部分。例如,如果你想生成一个8-12个字符的ID,你可以调用generateID(12)
来生成一个12个字符的ID。
这个方法的性能很好,UUID的生成速度非常快,几乎可以在1ms内生成100W个。而且由于UUID是随机生成的,所以生成的ID的冲突率也很低。
请注意,由于UUID的格式是固定的,所以你可以预分配一个UUID,然后截取你需要的一部分,这样可以在一定程度上提高性能。但是这种方法可能会在极端情况下导致ID的冲突,所以在生产环境中使用时需要谨慎。
https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E5...
↑直接看到Snowflake雪花算法示例那里
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
public static void main(String[] args) {
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
String str = snowflake.nextIdStr();
System.out.println(str);
}
不想用全数字类型那你可以和UUID等截断拼接嘛
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
public class IDGenerator {
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
public static String generateId(String prefix, int minLen, int maxLen) {
ThreadLocalRandom random = ThreadLocalRandom.current();
int length = random.nextInt(minLen, maxLen + 1);
String uniqueStr = random.ints(length, 0, CHARACTERS.length())
.mapToObj(CHARACTERS::charAt)
.map(Object::toString)
.collect(Collectors.joining());
return prefix + "_" + uniqueStr;
}
}
import string
import secrets
def generate_id(prefix: str,min_len=8,max_len=12):
characters=string.ascii_letters+string.digits # a-z,A-Z and 0-9.
length=secrets.choice(range(min_len,max_len+1))
unique_str=''.join(secrets.choice(characters) for _ in range(length))
return f"{prefix}_{unique_str}"
此程序会生成一个随机长度(介于min_len和max_len之间)且内容为大小写字母或数字组成的字符串,并添加前缀。极短时间内产生大量ID可能有点难,保证不重复只需要放在set中即可,1ms 100W你狂叠服务器可能都不太行,如果可以,考虑一下结合分布式唯一ID生成系统如Twitter的雪花算法
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答2.9k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
雪花算法