Java获取唯一服务器ID以供参考

5

我有一个独立的命令行Java应用程序正在服务器X上运行。需要知道它运行的机器的唯一ID。如何获取这个ID?也许像散列一样的东西。我不想在其中保存像ID文件这样的东西。是否有一种不依赖于IP、硬件等的方式来获取此唯一ID?


你为什么不想依赖于硬件,例如mac地址? - Luiggi Mendoza
ID是否需要可再现(确定性)?如果不需要,只需创建或甚至使用现有的UUID(在Linux下,您可以查看“blkid”命令)。 - Ortwin Angermeier
1个回答

2
您可以读取服务器的MAC地址,并将其用作唯一键。
以下代码片段来自http://www.tutego.de/blog/javainsel/2013/12/mac-adressen-auslesen/,展示了一个可能的实现。
 for ( NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces() ) ) {
   byte[] adr = ni.getHardwareAddress();
   if ( adr == null || adr.length != 6 )
      continue;
   String mac = String.format( "%02X:%02X:%02X:%02X:%02X:%02X",
                                adr[0], adr[1], adr[2], adr[3], adr[4], adr[5] );
   System.out.println( mac );
}

很抱歉,源文件是德语的,但我相信也存在英文文档。

根据评论进行编辑:

当然还要考虑MAC地址可能会有重复的情况。

以下链接显示可能的原因:https://serverfault.com/questions/462178/duplicate-mac-address-on-the-same-lan-possible

无论如何,使用MAC地址作为解决这个问题的方法是一种实用的方式。

使用哈希方法:http://preshing.com/20110504/hash-collision-probabilities/

或者

GUID:Is it safe to assume a GUID will always be unique?

也不能保证0.0%的可能性出现重复。


MAC地址可以被用户更改,并且仅在子网内保证唯一。 - user207421
@EJP 我知道这个问题会被提到,而且肯定会是一个问题。但是冲突的概率非常小。 - Diversity
如果您处于虚拟化世界中,比如VMWare,将虚拟机移动到新主机上会更改MAC地址,以及其他更改(如果某些配置设置正确)。 - Steve Tarver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接