尝试生成对特定计算机而言唯一的ID。 ID不会随机生成。它将基于计算,使得为计算机A生成的ID将是固定的并且对计算机A是唯一的。每当程序在计算机A上执行时,它将继续生成相同的ID,并且当在另一台计算机上执行时,它将生成该计算机唯一的另一个ID。这是为了确保两台计算机不具有相同的ID。
我的挑战:为了使我的程序能够生成计算机唯一的ID,它需要根据执行它的计算机所特有的种子执行计算。
我的问题:如何获取计算机唯一的值,以便我可以将该值用作ID生成程序中的种子?
是否可以从计算机的硬件(例如主板)获取该计算机独有的值?这样,只要计算机的主板没有更换,该值很可能不会改变。
答案 0 :(得分:10)
MAC地址?多数民众赞成(出于实际目的)unique to every 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地址可能会被欺骗。但是你谈到的是一小部分人在做这件事,除非你用它来反盗版,否则就足够了。
答案 1 :(得分:7)
Win32生成一个计算机SID,对于您可以通过WMI或Active Directory获得的每个安装应该是唯一的,但这是非常特定于平台的。您也可以像其他人提到的那样使用MAC地址,只需确保它是物理网络适配器,因为虚拟适配器往往在计算机之间共享相同的MAC地址。
但是,UUID(或GUID)是128位数,应该保证唯一,并且实际上是为了解决在多个随机机器上生成唯一标识符的问题而创建的。根据维基百科:
将这些数字放入视角, 每年遭受一次袭击的风险 陨石估计是一个 机会在170亿,[25]这意味着 概率约为0.00000000006 (6×10-11),相当于赔率 创造了几十万亿 UUID在一年内有一个 重复。换句话说,只有在之后 每个产生10亿UUID 第二个是未来100年 创造一个的概率 重复约为50%。该 一个重复的概率是 如果地球上每个人都约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类。
答案 2 :(得分:1)
一种简单的方法是读取以太网硬件或“mac”地址。
http://download.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getHardwareAddress()
Mac地址并不像人们想象的那么独特,因为随着时间的推移,它们会被重用。但是一个应用程序或具有两个相同应用程序的网络的可能性非常低。
答案 3 :(得分:0)
MAC地址足够独特。见http://en.wikipedia.org/wiki/MAC_address
您没有指定使用的语言。某些语言比其他语言更容易。以下是如何在Java http://www.kodejava.org/examples/250.html中执行此操作。谷歌周围的语言。
答案 4 :(得分:0)
您最好的选择是将ID建立在主网络适配器的MAC地址上。
这可能会在某些时候发生变化,但任何单个硬组件也是如此。
使用MAC地址计算FYI GUID。
答案 5 :(得分:0)
答案 6 :(得分:0)
如果您使用英特尔芯片的另一个选项是处理器序列号,假设您可以确保启用该功能。有关详细信息,请参阅Intel Serial # Note