如何在Java(整数)中生成唯一ID?
如何生成java中不是下一个数字的整数唯一ID?
它有多独特?
如果它只是一个进程中的唯一,那么你可以使用AtomicInteger
并在每次需要一个新值时调用incrementAndGet()
。
int uniqueId = 0; int getUniqueId() { return uniqueId++; }
如果您希望它是线程安全的,请添加synchronized
。
如果你有点受限,这很容易。
如果你有一个线程,你只需使用uniqueID ++; 退出时一定要存储当前的uniqueID。
如果您有多个线程,则可以使用公共同步的generateUniqueID方法(实现与上面相同)。
问题是当你有很多CPU时 – 无论是在集群中还是在某些分布式设置中,比如点对点游戏。
在这种情况下,您通常可以将两个部分组合在一起形成一个数字。 例如,生成唯一ID的每个进程都可以分配自己的2字节ID号,然后将其与唯一ID ++组合。 就像是:
return (myID << 16) & uniqueID++
分发“myID”部分可能很棘手,但有一些方法。 您可以从集中式数据库中获取一个,从集中式服务器请求唯一ID,...
如果你有一个Long而不是一个Int,其中一个常见的技巧是获取ETH0的设备ID(UUID),保证服务器是唯一的 - 然后只需添加一个序列号。
UUID类
只需生成ID并检查生成的ID列表中是否已存在。
如果你真的是指整数而不是int:
Integer id = new Integer(42); // will not == any other Integer
如果您希望JVM外部可见其他进程或用户,持久性或许多其他注意事项,那么还有其他方法,但如果没有上下文,您可能最好使用内部对象标识的唯一性你的系统。
你需要它吗?
- 两个JVM同时运行时是唯一的。
- 即使重新启动JVM也是唯一的。
- 线程安全的。
- 支持null? 如果没有,请使用int或long。
import java.util.UUID; public class IdGenerator { public static int generateUniqueId() { UUID idOne = UUID.randomUUID(); String str=""+idOne; int uid=str.hashCode(); String filterStr=""+uid; str=filterStr.replaceAll("-", ""); return Integer.parseInt(str); } // XXX: replace with java.util.UUID public static void main(String[] args) { for (int i = 0; i < 5; i++) { System.out.println(generateUniqueId()); //generateUniqueId(); } } }
希望这对你有所帮助。
随时独特:
int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
- 用于KML的Java API(JAK)以kmz文件嵌入图像
- 如何从控制器传递多个模型对象以及如何将所有作为命令对象传递到表单中:form in spring mvc?
- 众包公共Java系统属性和已知值的完整列表
- 如何读取文件,将数据放入JTable,然后修改单元格/删除行并将数据保存到文件中?
- 帮助编写自己的javax.swing.text.Document
- 如何在Spark中将JavaPairInputDStream转换为DataSet / DataFrame
- 线程“main”中的exceptionjava.lang.NoClassDefFoundError:名称错误
- Junit测试用例exception
- 将16位pcm转换为8位