Нужно как-то идентифицировать локальную машину в java - PullRequest
1 голос
/ 17 мая 2011

Я пытаюсь узнать имя локальной машины (или какой-то другой способ уникальной идентификации конкретной машины), на котором запущено приложение.

Я использую это:

String hostname = java.net.InetAddress.getLocalHost().getHostName();

, который работает нормально, но я только что заметил в профилировщике, что на его выполнение уходит довольно много времени, поэтому мне стало интересно, было ли что-то функционально похожее, что выполнялось бы быстрее.

Не обязательно должно быть именем хоста, может быть чем угодно, лишь бы оно однозначно идентифицировало машину.

Ответы [ 5 ]

5 голосов
/ 17 мая 2011

Чтобы однозначно идентифицировать машину, я бы использовал системный MAC-адрес, используя getHardwareAddress().

Однако я не уверен, что это будет быстрее - но это определенно лучший способоднозначно идентифицируя машину.

Например, см .: http://www.java2s.com/Code/Java/Network-Protocol/GetMACaddressofahostjavanetNetworkInterfacegetHardwareAddress.htm

2 голосов
/ 17 мая 2011

Вы можете получить MAC-адрес машины. Вот пример того, как его получить.

byte[] mac = null;
List<NetworkInterface> interfaces = 
    (List<NetworkInterface>) Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface iface: interfaces) {
    if (!iface.isLoopback()) {
        mac = iface.getHardwareAddress();
        if (mac != null) {
            break;
        }
    }
}

Этот код извлекает MAC-адрес из первого интерфейса, в котором он есть. В дополнение к интерфейсам обратной связи, некоторые машины могут также иметь виртуальные интерфейсы для VPN, с которыми не связаны аппаратные адреса.

1 голос
/ 17 мая 2011

Пробовал getHostAddress()?Из документов кажется, что getHostName() включает сначала проверку безопасности (если есть SecurityManager), что означает еще один вызов метода.

0 голосов
/ 08 мая 2013

Просто чтобы спасти следующего человека от спотыкания по неполному поисковому коду 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-адрес, и возвращает его в виде милой строки в качестве бонуса.

0 голосов
/ 17 мая 2011

Я придумал это:

String dirname = Utils.safetrim(System.getProperty("user.dir"));

Очевидно, что мир не может однозначно идентифицировать машину, но для моих целей это достаточно хорошо, потому что каждый человек, работающий с этой программой, будет зарегистрирован как сам и, вероятно,запускаться из их домашнего каталога, поэтому он делает ответ достаточно уникальным для меня.

И, конечно, он очень быстр, что является важной частью.

...