12

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

我正在尝试生成对特定计算机唯一的 ID。ID不会随机生成。它将是基于计算的,这样为计算机A生成的ID将是固定的,对计算机A来说是唯一的。程序每次在计算机A上执行时,都会继续生成相同的ID,在另一台计算机上执行时,它会生成该计算机唯一的另一个 ID。这是为了确保两台​​计算机没有相同的 ID。

我的挑战:为了让我的程序能够生成计算机独有的 ID,它需要基于执行它的计算机独有的种子来执行计算。

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

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

4

7 回答 7

10

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 地址可以被欺骗。但是您谈论的是一小部分人这样做,除非您将其用于反盗版,否则它就足够独特了。

于 2010-09-05T02:09:44.143 回答
7

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 类。

于 2010-09-05T02:53:03.593 回答
1

一个简单的方法是读取以太网硬件或“mac”地址。

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

Mac 地址并不像人们想象的那么独特,因为随着时间的推移它们确实会被重复使用。但是,一个应用程序或网络拥有两个相同应用程序或网络的几率非常低。

于 2010-09-05T02:10:08.560 回答
0

MAC 地址对您来说是唯一的。见 http://en.wikipedia.org/wiki/MAC_address

您没有指定您使用的语言。在某些语言中可能比其他语言更容易。以下是如何在 Java http://www.kodejava.org/examples/250.html中执行此操作。谷歌搜索你的语言。

于 2010-09-05T02:10:38.870 回答
0

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

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

仅供参考 GUID 使用 MAC 地址计算。

于 2010-09-05T02:11:51.653 回答
0

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

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

序列号、资产标签

于 2010-09-05T02:15:37.520 回答
0

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

于 2010-09-05T02:26:56.553 回答