Создание идентификатора, уникального для конкретного компьютера [дубликат]

Возможные Дубликаты:
надежный способ генерации уникального аппаратного ID

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

Мой Вызов: чтобы моя программа могла генерировать идентификатор, уникальный для компьютера, она должна выполнить расчет на основе семени, уникального для компьютера, выполняющего его.

Мой Вопрос: как я могу получить значение, уникальное для компьютера, чтобы я мог использовать значение в качестве семени в генерации ID программа?

можно ли получить значение от аппаратного обеспечения компьютера (например, материнской платы), которое уникально для этого компьютера? Таким образом, значение, скорее всего, не изменится до тех пор, пока материнская плата компьютера не будет заменена.

7 ответов


MAC-адрес? Это (для практических целей) уникальный для каждого NIC так оно гарантирует воспроизводимость даже если потребитель двойная загрузка. Конечно, есть редкие случаи людей, торгующих картами, но в сочетании с другими метриками (не только используйте это, так как сетевые карты могут быть изменены), это все еще возможно.

Как бы вы сделать это?

public static byte[] getMACAddress() throws SocketException, UnknownHostException {
    InetAddress address = InetAddress.getLocalHost();
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(address);

    return networkInterface.getHardwareAddress();
}

Если вы хотите строковое представление этого

for (int byteIndex = 0; byteIndex < macAddress.length; byteIndex++) {
    System.out.format("%02X%s", macAddress[byteIndex], (byteIndex < macAddress.length - 1) ? "-" : "");
}

(спасибо http://www.kodejava.org/examples/250.html)

Примечание: как упоминалось в комментариях, Mac-адреса могут быть подделаны. Но вы говорите о небольшой части населения, делающей это, и если вы не используете это для борьбы с пиратством, это достаточно уникально.


Win32 генерирует SID компьютера, который должен быть уникальным для каждой установки, которую вы можете получить через WMI или Active Directory, но это довольно специфично для платформы. Вы также можете использовать MAC-адрес, как и все остальные, просто убедитесь, что это физический сетевой адаптер, поскольку виртуальные адаптеры имеют тенденцию использовать один и тот же MAC-адрес на разных компьютерах.

однако UUID (или GUID) являются 128-битными числами, которые должны быть гарантированы уникальными и фактически создан с целью решения задачи генерации уникальных идентификаторов на нескольких случайных машинах. Согласно Википедии:

положить эти цифры в перспективе, ежегодный риск попадания метеорит оценивается в один шанс в 17 миллиардов,[25], что означает вероятность примерно 0.00000000006 (6 × 10-11), что эквивалентно шансы создание нескольких десятков триллионов UUIDs в год и имея один дубликат. Иначе говоря, только после создание 1 миллиарда UUIDs каждый второй в течение следующих 100 лет, вероятность создания только одного дубликат будет около 50%. Этот вероятность один дубликат будет около 50% если каждый человек на земле владеет 600 миллионами UUIDs.

общее количество возможных комбинаций составляет 2^128 (или 3 x 10^38), поэтому я склонен верить в это. Кроме того, большинство современных генераторов UUID больше не используют алгоритм V1 (т. е. основанный на MAC-адресе), поскольку он рассмотрена проблема безопасности из-за того, что можно сказать, когда был сгенерирован GUID и кто его сгенерировал. В мире Win32 патч безопасности около Win2K или NT 4 изменился, чтобы использовать версию алгоритма V4, которая основана на псевдослучайном числе вместо MAC, и JVM всегда использовал версию V3/V4.

EDIT: метод, используемый для создания UUID в Java, через java.утиль.Класс по UUID.


простой способ сделать это-прочитать аппаратное обеспечение ethernet или адрес "mac".

http://download.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getHardwareAddress()

Mac-адреса не так уникальны, как люди думают, поскольку они повторно используются с течением времени. Но шансы одного приложения или сети, имеющей два одинаковых, довольно низки.


MAC-адрес достаточно уникален для того, что вы. См.http://en.wikipedia.org/wiki/MAC_address

вы не указали, какой язык вы используете. На некоторых языках это может быть проще, чем на других. Вот как это сделать в Java http://www.kodejava.org/examples/250.html. Google вокруг для вашего языка.


ваш лучший вариант-основать ID на MAC-адресе основного сетевого адаптера.

Это потенциально может измениться в какой-то момент, но так же и любой отдельный жесткий компонент.

FYI GUID вычисляются с использованием MAC-адреса.


иметь доступ к любой информации, описанной в этой статье? Окна-только

http://msdn.microsoft.com/en-us/library/aa394587.aspx

серийный номер, инвентарный


другой вариант, если вы используете чипы intel, - это серийный номер процессора, если вы можете гарантировать, что функция включена. См. Intel Serial # Примечание дополнительная информация