生成特定计算机唯一的ID

可能重复:
生成唯一硬件ID的可靠方法

我试图生成一个特定计算机唯一的ID。 ID不会随机生成。 它将基于计算,使得为计算机A生成的ID将是固定的并且对计算机A是唯一的。每当程序在计算机A上执行时,它将继续生成相同的ID,并且当在另一台计算机上执行时,它将生成该计算机唯一的另一个ID。 这是为了确保两台​​计算机不具有相同的ID。

我的挑战:为了使我的程序能够生成计算机唯一的ID,它需要根据执行它的计算机所特有的种子执行计算。

我的问题:如何获得计算机唯一的值,以便我可以将该值用作ID生成程序中的种子?

是否有可能从计算机的硬件(例如主板)获取该计算机独有的值? 这样,只要不更换计算机的主板,该值很可能不会改变。

MAC地址? 这是(对于实际目的) 每个NIC独有的,因此即使用户是双启动,它也保证了可重复性。 当然,很少有人会交易卡,但加上其他指标 (不仅要使用它,因为网卡可以更改),它仍然是可能的。

你会怎么做到的?

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地址可能会被欺骗。 但是你在谈论一小部分人在做这件事,除非你用它来反盗版的东西,它的独特之处。

Win32生成一个计算机SID,对于您可以通过WMI或Active Directory获得的每个安装应该是唯一的,但这是非常特定于平台的。 您也可以像其他人提到的那样使用MAC地址,只需确保它是物理网络适配器,因为虚拟适配器往往在计算机之间共享相同的MAC地址。

但是,UUID(或GUID)是128位数,应该保证是唯一的,并且实际上是为了解决在多个随机机器上生成唯一标识符的问题而创建的。 根据维基百科:

为了正确看待这些数字,被陨石击中的年度风险估计为170亿次,[25]这意味着概率约为0.00000000006(6×10-11),相当于创造几率。一年内有几十万亿的UUID并且有一个副本。 换句话说,只有在接下来的100年中每秒产生10亿UUID之后,仅创建一个副本的概率大约为50%。 如果地球上的每个人拥有6亿UUID,则一次重复的概率约为50%。

可能的组合总数是2 ^ 128(或3 x 10 ^ 38),所以我倾向于相信它。 此外,大多数现代UUID生成器不再使用V1算法(即基于MAC地址的算法),因为它被认为是一个安全问题,因为人们可以知道GUID何时生成,以及谁生成了它。 在Win32世界中,大约Win2K或NT 4的安全补丁更改为使用算法的V4版本,该版本基于伪随机数而不是MAC,并且JVM始终使用V3 / V4版本。

编辑:用于在Java中生成UUID的方法是通过java.util.UUID类。

一种简单的方法是读取以太网硬件或“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中执行此操作。 谷歌周围的语言。

您最好的选择是将ID基于主网络适配器的MAC地址。

这可能会在某些时候发生变化,但任何单个硬组件也是如此。

FYI GUID使用MAC地址计算。

您是否可以访问本文中描述的任何信息? 仅Windows

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

序列号,资产标签

您使用英特尔芯片的另一个选项IFF是处理器序列号,假设您可以确保启用该function。 有关详细信息,请参阅Intel Serial#Note

Interesting Posts