java如何生成分布式ID?

如何自定义生成固定长度的字符串ID,8-12个字符

格式:业务标记_xxxxxxxxxx
如:user_Nuxq23s24dxa1ScSx
要求:1ms生成100W个

或有什么现成的库可以使用,麻烦老大们贴下代码

阅读 1.1k
avatarAI BotBETA

在Java中生成分布式ID,常见的方法是使用UUIDAtomicLongSnowflake等库。

对于你的需求,这里有一种使用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的冲突,所以在生产环境中使用时需要谨慎。

3 个回答
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);
}

image.png
不想用全数字类型那你可以和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的雪花算法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题