2015-04-22 22 views
5

我有一個獨立的命令行java應用程序運行在服務器X上。它需要我知道它運行的機器的唯一ID。如何獲得此ID?也許像一個哈希。我不想在裏面保存一些類似ID的文件。有沒有辦法讓這個獨特的ID不依賴於IP,硬件等?java得到唯一的服務器ID供參考

+0

爲什麼你不想依賴於硬件,例如MAC地址? –

+0

身份證是否可重複(確定性)?如果沒有,只需創建或者使用現有的UUID(在linux下你可以看看'blkid'命令)。 –

回答

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%的風險。

+0

MAC地址可以由用戶更改,並且只能保證在子網內唯一。 – EJP

+0

@EJP我知道這個問題會被提及,肯定它可能是一個問題。但衝突的可能性非常小。 – Diversity

+0

如果您處於虛擬世界中,說VMWare,將vm移動到新主機將更改mac地址以及其他更改(如果某些配置設置正確)。 –