2010-09-05 16 views
11

Duplicar posibles:
Reliable way of generating unique hardware IDGeneración de identificación único para un equipo determinado

Am tratando de generar un identificador que será único para un equipo determinado. La ID no se generará aleatoriamente. Se basará en el cálculo, de modo que la ID generada para la computadora A será fija y única para la computadora A. Cada vez que el programa se ejecute en la computadora A, continuará generando la misma ID y cuando se ejecute en otra computadora, generará otra identificación única para esa computadora. Esto es para asegurar que dos computadoras no tengan la misma identificación.

Mi desafío: Para que mi programa pueda generar un ID único para una computadora, necesita realizar el cálculo basado en una semilla única para la computadora que lo ejecuta.

Mi pregunta: ¿Cómo puedo obtener un valor único para una computadora, de modo que pueda usar el valor como una semilla en el programa de generación de ID?

¿Es posible obtener un valor del hardware de una computadora (por ejemplo, la placa base) que es exclusivo de esa computadora? De esta forma, es muy probable que el valor no cambie siempre que no se remplace la placa madre de la computadora.

+2

No se puede hacer de una manera significativa que no pueda ser subvertida por un propietario de computadora suficientemente motivado. Si está tratando de encontrar una manera para que los dispositivos se distingan de forma exclusiva de los demás a los que están conectados, esa es una pregunta diferente para la que existen soluciones cooperativas. – msw

+2

¿Qué pasa con las máquinas virtuales que no tienen componentes físicos? ¿Son 2 máquinas virtuales la misma máquina si tienen los mismos datos de configuración? – emory

+0

Muchas gracias por la respuesta rápida chicos. ¿Es posible obtener la ID del procesador primario de una computadora? Vi algo similar en algún lugar de Internet, pero está en C#. Me pregunto si será posible lograr lo mismo en Java. –

Respuesta

10

¿dirección MAC? Eso es (para fines prácticos) unique to every NIC por lo que garantiza la reproducibilidad incluso si el usuario tiene arranque dual. Claro que hay raros casos de tarjetas de intercambio de personas, pero junto con otras métricas (no solo use esto, ya que las tarjetas de red se pueden cambiar), aún es posible.

¿Cómo lo conseguir?

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

    return networkInterface.getHardwareAddress(); 
} 

Si desea una representación de cadena, hacer esto

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

(gracias a http://www.kodejava.org/examples/250.html)

Nota: Como se mencionó en los comentarios, las direcciones MAC pueden ser falseadas. Pero estás hablando de que una pequeña parte de la población hace esto, y a menos que uses esto para combatir la piratería, es lo suficientemente único.

+0

En la misma página de Wikipedia a la que se enlaza hay un enlace a http://en.wikibooks.org/wiki/Changing_Your_MAC_Address Las direcciones MAC son ** no ** únicas. – msw

+0

No es completamente único y no hay garantía, de hecho, se sabe que las direcciones se reutilizan, pero * casi * único y * casi * garantizado, seguro ... – DigitalRoss

+0

@msw @DigitalRoss El hardware se puede quitar, el hardware se puede cambiar , el hardware puede ser falsificado, etc. No se garantiza la exclusividad. Las direcciones Mac son lo suficientemente únicas. Consulte la actualización – TheLQ

0

La dirección MAC es lo suficientemente única para lo que usted. Consulte http://en.wikipedia.org/wiki/MAC_address

No especificó el idioma que está utilizando. Puede ser más fácil en algunos idiomas que en otros. Aquí es cómo hacerlo en Java http://www.kodejava.org/examples/250.html. Busca tu idioma en Google.

+0

Fortuitamente, las etiquetas de publicación * no especifican qué idioma está usando. Y tres personas dieron esta respuesta antes de que terminara de escribir la mía ... Creo que es un nuevo disco. :) –

0

Su mejor opción es basar el ID en la dirección MAC del adaptador de red primario.

Es probable que esto cambie en algún punto, pero también lo es cualquier componente duro.

FYI Los GUID se calculan utilizando la dirección MAC.

+0

Ja, ja ... 4 por el precio de uno. – ocodo

0

¿Tiene acceso a la información descrita en este artículo? Sólo para Windows

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

número de serie, la etiqueta de propiedad

+0

¿El número de serie está relacionado con Windows o con el número de serie del fabricante real? – avacariu

+0

Y no plataforma cruzada ... – TheLQ

+0

Se refiere a la carcasa física. Señalé que es una solución solo de Windows, si funciona. – James

0

Otra opción IFF está utilizando chips de Intel es el número de serie del procesador, suponiendo que usted puede asegurar la función está activada. Consulte Intel Serial # Note para obtener más información

+0

Está usando Java, no hay ninguna noción de procesador :) –

7

Win32 genera un SID de computadora, que se supone que es único para cada instalación que puede obtener a través de WMI o Active Directory, pero que es bastante específico de la plataforma. También puede usar la dirección MAC, como todos han mencionado, simplemente asegúrese de que sea un adaptador físico de red, ya que los adaptadores virtuales tienden a compartir la misma dirección MAC en las computadoras.

Sin embargo, los UUID (o GUID) son números de 128 bits que se supone deben garantizarse como únicos, y se crearon con el propósito de resolver el problema de generar identificadores únicos en múltiples máquinas aleatorias. Según Wikipedia:

Para poner estas cifras en perspectiva, el riesgo anual de uno de ser golpeado por un meteorito se estima que es uno oportunidad en 17 mil millones, [25] que significa la probabilidad es de unos ,00000000006 (6 × 10-11), equivalente a las probabilidades de creando unas pocas decenas de trillones de UUID en un año y teniendo un duplicado. En otras palabras, solo después de generando mil millones de UUID cada segundo para los próximos 100 años, la probabilidad de crear solo un duplicado sería de aproximadamente 50%. La probabilidad de un duplicado sería aproximadamente 50% si cada persona en la tierra posee 600 millones de UUID.

El número total de combinaciones posibles es 2^128 (o 3 x 10^38), así que tiendo a creerlo. Además, la mayoría de los generadores UUID modernos ya no usan el algoritmo V1 (es decir, el basado en la dirección MAC), ya que se considera un problema de seguridad debido al hecho de que uno puede saber cuándo se generó el GUID y quién lo generó. . En el mundo de Win32, un parche de seguridad alrededor de Win2K o NT 4 cambió para usar la versión V4 del algoritmo, que se basa en un número pseudoaleatorio en lugar del MAC, y la JVM siempre ha utilizado la versión V3/V4.

EDITAR: El método utilizado para generar UUID en Java es a través de la clase java.util USID.

+0

Entonces, ¿haría 'UUID.fromString (" alguna cadena ");' generar el mismo UUID exacto sobre varias instancias de VM? ¿Qué tal en la misma computadora pero en un sistema operativo diferente? – TheLQ

+0

@TheLQ: "alguna cadena" no se puede analizar :) ¿Leyó http://www.ietf.org/rfc/rfc4122.txt? – extraneon

+0

@TheLQ: la sintaxis sería 'UUID.fromString (" {00000000-0000-0000-0000-000000000000} ")', y se usaría para convertir una representación de cadena existente de un UUID a una clase UUID, así que sí, obtendrías el mismo UUID cada vez por el mismo valor de entrada (suponiendo que hayas codificado la cadena de entrada). Para generar un UUID nuevo, debe usar 'UUID.randomUUID()', que debe ser único en varias instancias de VM. – Javert93

Cuestiones relacionadas