是否有可能为特定的JVM实例获取真正唯一的ID?

我需要一种方法来从JVM中运行的Java代码中唯一地永久地标识JVM的实例。

也就是说,如果我在同一台机器上同时运行两个JVM,则每个JVM都是可区分的。 它也可以与在其他计算机上运行JVM以及在同一台计算机上的未来执行区分开,即使重用了进程ID也是如此。

我想我可以通过识别开始时间,机器MAC和进程ID来实现这样的东西,并以某种方式组合它们。 我想知道是否有一些标准的方法来实现这一目标。

更新 :我看到每个人都推荐了整个会话的UUID。 这似乎是一个好主意,虽然可能有点太重量级了。 这是我的问题:我想使用JVM id在每个JVM执行中创建多个唯一标识符,以某种方式合并JVM实例。

我的理解是你不应该将其他数字混合到一个UUID中,因为不再保证唯一性。 另一种方法是将UUID转换为字符串并将其链接,但随后它变得太长。 克服这个想法?

您可以在程序开始时生成UUID ,并在程序运行期间使用它。

 UUID id = UUID.randomUUID(); 

除了randomUUID()方法之外,还有其他方法可以生成更适合您需求的UUID ,有关详细信息,请参阅类java.util.UUID的API文档。

您可以在应用程序启动时创建UUID并将其用于标识。

UUID UniqueID = UUID.randomUUID();

如果UUID太重,你需要通过“唯一和永久”来回顾你的意思。

例如,如果要将“唯一且永久”限制为对于给定网络上的计算机而言是唯一的,并且对于下一个(比如说)10年而言是永久性的,则可以使用在UUID生成中使用的相同方法但具有较少位。

或者,如果您要使用持久性存储创建唯一的id生成服务,并将“permanent”的概念与该存储的生命周期联系起来,那么唯一的ID可能只是一个递增的整数序列。

为什么不使用Singleton持有java.rmi.server.UID实例?

我不知道有一个标准的库,但你可以自己开始使用开始时间(使用新的java.util.Date()和System.currentMillis进行一些计算),安装的路径,以及JVM的路径(考虑只连接所有System.getProperties())。

你有一个可以与之交谈的中央服务器吗? 然后可以从中央服务器检索uuid。