Просто чтобы спасти следующего человека от спотыкания по неполному поисковому коду MAC, вот моя версия, которая работает как на моей машине с Windows 7, так и на других компьютерах. Обратите внимание, что код может по-прежнему возвращать разные MAC-адреса при каждом вызове в случае, если пользователь испортил свое оборудование и сетевые устройства могут быть возвращены в другом порядке.
private static final String generateHashIdentifier() throws Exception {
Enumeration<NetworkInterface> networkInterfaces
= NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
if (networkInterface == null
|| networkInterface.isLoopback()
|| networkInterface.isVirtual()) {
continue;
}
byte[] mac = networkInterface.getHardwareAddress();
if (mac == null || mac.length == 0)
continue;
StringBuilder sb = new StringBuilder();
int zeroFieldCount = 0;
for (int i = 0; i < mac.length; i++) {
if (mac[i] == 0)
zeroFieldCount++;
sb.append(String.format("%02X%s", mac[i],
(i < mac.length - 1) ? "-" : ""));
}
if (zeroFieldCount > 4)
continue;
return sb.toString();
}
throw new RuntimeException("Failed to obtain MAC");
}
В Windows я получаю тонны дополнительных устройств, которые могут возвращать или не возвращать NULL mac или mac с большей частью нулями. Код пытается найти первое устройство, которое дает разумный MAC-адрес, и возвращает его в виде милой строки в качестве бонуса.