Ho un'app java da riga di comando autonoma che gira sul server X. E mi è richiesto di conoscere l'ID univoco della macchina su cui è in esecuzione. Come ottenere questo ID? Forse qualcosa come un hash. Non voglio tenere lì qualcosa di simile a un file con ID all'interno. C'è un modo per ottenere questo ID univoco che non dipende da IP, hardware, ecc.?java ottiene ID server univoco per riferimento
risposta
È possibile leggere l'indirizzo MAC del server e utilizzarlo come chiave univoca.
Il seguente frammento di codice da http://www.tutego.de/blog/javainsel/2013/12/mac-adressen-auslesen/ mostra una possibile implementazione.
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);
}
Mi dispiace che la fonte è in tedesco, ma sono abbastanza sicuro che esiste una documentazione inglese, anche.
EDIT causa di commentare:
Deve ovviamente da considerare che anche l'indirizzo MAC può avere duplicati.
link seguente mostra le possibili ragioni https://serverfault.com/questions/462178/duplicate-mac-address-on-the-same-lan-possible
In entrambi i casi si utilizza un indirizzo MAC come una soluzione per questo problema è un modo pragmatico.
Utilizzo di hashing-metodi: http://preshing.com/20110504/hash-collision-probabilities/
o
GUID: Is it safe to assume a GUID will always be unique?
anche non garantiscono un rischio 0,0% per eventuali duplicati.
Gli indirizzi MAC possono essere modificati dall'utente e sono garantiti per essere unici all'interno di una sottorete. – EJP
@EJP sapevo che questo problema sarebbe stato menzionato e sicuramente potrebbe essere un problema. Ma la probabilità di uno scontro è piuttosto piccola. – Diversity
Se ci si trova in un mondo virtualizzato, ad esempio VMWare, lo spostamento del vm in un nuovo host cambia l'indirizzo mac e altre modifiche se alcune impostazioni di configurazione sono corrette. –
Perché non si desidera dipendere dall'hardware, ad es. indirizzo MAC? –
L'ID deve essere riproducibile (deterministico)? Altrimenti, basta creare o persino usare un UUID esistente (sotto linux si potrebbe dare un'occhiata al comando 'blkid'). –