如何在 Java 中自动递增字母数字 ID

How to auto increment an alpha numeric id in Java

我想在 Java 程序中实现一个自动递增字母数字 ID 的功能。

ids 类型是字符串,只有数字和小写拉丁字母,不区分大小写。

基本上,我想要一个名为 static String next(String id) 的函数,它给出下一个 ID 应该是什么。

id应该从右到左递增,新字符应该在左边添加。

例如

assertEquals("1", IdUtils.next("0"));
assertEquals("a", IdUtils.next("9"));
assertEquals("10", IdUtils.next("z"));
assertEquals("10", IdUtils.next("0z"));
assertEquals("100", IdUtils.next("zz"));
assertEquals("zz1", IdUtils.next("zz0"));
assertEquals("zza", IdUtils.next("zz9"));

提前致谢。

如果您要增加一个 "current ID" 变量,那么最好将该状态保持在 AtomicLong 而不是 String。它更快,也更容易实现线程安全:

... 
AtomicLong m_nextId = new AtomicLong();

static String next() {
    long idnum = m_nextId.getAndIncrement();
    return Long.toString(idnum,36);
}

带有数字和小写拉丁字母的数字是 base-36 数字,它是 base-16 的扩展,也称为十六进制。

所以要增加 base-36 数字,解析它,增加它,然后转换回文本。

static String next(String id) {
    return Long.toString(Math.incrementExact(Long.parseLong(id, 36)), 36);
}

测试

System.out.println(next("0"));
System.out.println(next("9"));
System.out.println(next("z"));
System.out.println(next("zzzzzz"));
System.out.println(next("dif5613ug"));
System.out.println(next("1y2p0ij32e8e6"));
System.out.println(next("1y2p0ij32e8e7")); // Long.MAX_VALUE, so will overflow

输出

1
a
10
1000000
dif5613uh
1y2p0ij32e8e7
Exception in thread "main" java.lang.ArithmeticException: long overflow