我正在构建一个应用程序(在java中),我想为自己提供一些性能。我正在计时多个长时间运行的进程,并且我将使用一个Web服务器来接收指标,但是我想为特定用户创建一个唯一的数字(我的程序不需要是登录)在计算机上。
因此,如果Joe登录到计算机A并运行我的应用程序,它会给他一个唯一的号码,如1234.然后,如果Jane登录到同一台计算机,它将使用不同的号码,例如4321.但是如果Joe记录在计算机B上,它会完全创建一个单独的数字,例如5678.另外(只是为了澄清)如果Joe重新登录到计算机A,它仍然会产生数字1234.
另外,只是为了让它更具挑战性,如果同一台计算机在不同的网络上,那么我最好想要一个不同的ID。
这些数字是任意的,并且会比这长。到目前为止,我的代码会生成 8akb7d3n7lp1i1jo6apfhegp593kja5hg38b6o1a5godm38g97omm7bmc3jekc6apopgjhf9g
作为我的UID:
try {
byte[] mac = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress();
String names = new BigInteger(mac).toString(16) + InetAddress.getLocalHost().getHostAddress() + get("user.name") + get("os.version") + get("java.vendor");
BigInteger uid = new BigInteger(names.getBytes());
thisUsersUid = uid.toString(26);
} catch (SocketException ex) {
Logger.getLogger(TimingLogger.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnknownHostException ex) {
Logger.getLogger(TimingLogger.class.getName()).log(Level.SEVERE, null, ex);
}
我不希望这些信息很容易阅读(因为你可能会发现names="-f4b86eb8ee1192.168.0.20lee10.6.8Apple Inc."
)所以我将添加一个哈希函数。
所以我的问题,毕竟这个问题是:这是一个很好的方法吗?那里有一个可以比这更好的图书馆吗?或者我只是想要太多?
提前致谢(即使是那些评论说:为什么?)
答案 0 :(得分:4)
您可以使用UUIDs。
在Java中:UUID id = UUID.randomUUID();
答案 1 :(得分:3)
你的问题并不完全清楚,所以我将陈述一些假设。
如果是这样,这里有几个选项。
首次运行应用程序时,生成随机UUID并将其存储在用户的主目录或首选项中。随后的时间,在您的应用程序存储它的地方查找现有的UUID。
生成UID作为用户帐户名和机器MAC地址的MD5(或类似)哈希值。这应该在重新启动时保持稳定...除非用户的PC实现方式有些奇怪。
(如果安全性是主要问题,那么第一种方法不会 - 您必须假设用户可以找到并删除已保存的UUID。在第二种方法中,您遇到的问题是用户可能欺骗他的帐户名称和/或更改PC的MAC地址。对于任何方案,你有一个更大的问题,即在用户的PC上安装或运行的任何软件都可能被黑客攻击,用用户想要的东西替换UID。简而言之,你是如果您的用户具有黑客技能和动力,那么就要打一场失败的战斗。)
那里有一个可以比这更好的图书馆吗?或者我只是想要太多?
我不知道现有的库会这样做。
答案 2 :(得分:1)
这是一个很好的加密哈希函数的应用程序。最先进的是SHA-2。正如您所做的那样,连接所有独立的数量以一些可重复的方式构建一个字符串,并通过散列运行它以获得一个256位(32字节)的值。
您选择包含操作系统和Java供应商似乎很奇怪,因为这意味着例行升级或更改可能会产生新的ID。根据您给出的标准,MAC,IP和用户名似乎是我的最佳组合。