Генерация идентификатора, уникального для конкретного компьютера

Возможный дубликат:
Надежный способ создания уникального идентификатора оборудования

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

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

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

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

Ответ 1

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

Как бы вы это поняли?

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

    return networkInterface.getHardwareAddress();
}

Если вам требуется представление String, сделайте это

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Лучше всего использовать идентификатор на MAC-адресе основного сетевого адаптера.

Вероятно, это может измениться в какой-то точке, но так же как и любой жесткий компонент.

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

Ответ 7

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