Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成特定计算机的唯一ID_Java_Hardware_Uniqueidentifier_Hardware Id - Fatal编程技术网

Java 生成特定计算机的唯一ID

Java 生成特定计算机的唯一ID,java,hardware,uniqueidentifier,hardware-id,Java,Hardware,Uniqueidentifier,Hardware Id,可能重复: 我正在尝试生成一个特定计算机的唯一ID。不会随机生成ID。它将基于计算,因此为计算机A生成的ID将是固定的,并且对计算机A是唯一的。每当程序在计算机A上执行时,它将继续生成相同的ID,当在另一台计算机上执行时,它将生成该计算机唯一的另一个ID。这是为了确保两台计算机没有相同的ID 我的挑战:为了让我的程序能够生成计算机唯一的ID,它需要根据执行它的计算机唯一的种子执行计算 我的问题:如何获取计算机特有的值,以便在ID生成程序中将该值用作种子 是否有可能从计算机的硬件(如主板)中获取

可能重复:

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

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

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

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

MAC地址?这是(出于实际目的),因此即使用户是双引导,也能保证其再现性。当然,很少有人用信用卡交易,但是结合其他指标(不要只使用这个,因为网卡是可以更改的),这仍然是可能的

你是怎么得到的

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) ? "-" : "");
}
for(int-byteIndex=0;byteIndex
(感谢)


注意:如评论中所述,Mac地址可能被欺骗。但是你说的是一小部分人在这样做,除非你把它用于反盗版的东西,否则它就足够独特了。

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


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

MAC地址对于您需要的内容来说是唯一的。看


您没有指定正在使用的语言。有些语言可能比其他语言更容易。下面是如何在Java中实现这一点。谷歌搜索你的语言。

你最好的选择是根据主网络适配器的MAC地址确定ID

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


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

您有权访问本文中描述的任何信息吗?仅限窗口


序列号,资产标签

如果您使用的是英特尔芯片,另一个选项是处理器序列号,前提是您可以确保该功能已启用。有关更多信息,请参见。Win32生成计算机SID,对于通过WMI或Active Directory获得的每个安装,该SID都应该是唯一的,但这是特定于平台的。您也可以使用MAC地址,正如其他人所提到的,只需确保它是物理网络适配器,因为虚拟适配器往往在计算机之间共享相同的MAC地址

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

要正确看待这些数字, 一个人每年有可能被地震击中的风险 据估计,陨石是其中之一 170亿人中的机会,这意味着 概率约为0.00000000006 (6 × 10−11) ,相当于 创造数十万亿美元 UUID在一年内有一个 重复。换句话说,只有在 每年产生10亿个UUID 在接下来的100年中,第二个 仅创建一个的概率 复制率大约为50%。这个 一次重复的可能性是 如果地球上的每个人 拥有6亿个UUID

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


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

它不能以任何有意义的方式完成,而这是一个有足够动机的计算机所有者无法颠覆的。如果您正试图找到一种方法,使设备能够唯一地将自己与所连接的其他设备区分开来,这是另一个有协作解决方案的问题。没有物理组件的虚拟机呢?如果两个虚拟机具有相同的配置数据,那么它们是同一台机器吗?非常感谢快速响应人员。是否可以获取计算机主处理器的ID。我在网上的某个地方看到了类似的东西,但都是用C语言写的。我想知道是否有可能在Java中实现同样的功能。幸运的是,post标记确实指定了他使用的语言。在我完成打字之前,有三个人给出了这个答案。。。我认为这是一个新记录在您链接到的同一Wikipedia页面上,指向MAC地址的链接不是唯一的。如果我更改了网卡,请不要强迫我重新安装我的软件。@EJP 95%的情况下,它们不会被用户欺骗。你所说的一小部分人,A)甚至知道怎么做,B)是偏执狂,C)关心