为用户创建唯一编号的最佳方法是多次重启

时间:2012-06-17 01:05:25

标签: java performance

我正在构建一个应用程序(在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.")所以我将添加一个哈希函数。

所以我的问题,毕竟这个问题是:这是一个很好的方法吗?那里有一个可以比这更好的图书馆吗?或者我只是想要太多?

提前致谢(即使是那些评论说:为什么?)

3 个答案:

答案 0 :(得分:4)

您可以使用UUIDs

在Java中:UUID id = UUID.randomUUID();

答案 1 :(得分:3)

你的问题并不完全清楚,所以我将陈述一些假设。

  • 您的应用程序已安装在用户的PC上。 (它不是具有沙盒限制访问权限的applet或类似物。)
  • UID由用户计算机上运行的应用程序生成,而不是服务器。
  • 您无需从UID恢复用户的名称和机器标识;即只是一个不透明的标识符。
  • 您的解决方案无需安全。 (如果用户决定乱用并在同一台机器上生成不同的UID,那并不重要。)

如果是这样,这里有几个选项。

  • 首次运行应用程序时,生成随机UUID并将其存储在用户的主目录或首选项中。随后的时间,在您的应用程序存储它的地方查找现有的UUID。

  • 生成UID作为用户帐户名和机器MAC地址的MD5(或类似)哈希值。这应该在重新启动时保持稳定...除非用户的PC实现方式有些奇怪。

(如果安全性是主要问题,那么第一种方法不会 - 您必须假设用户可以找到并删除已保存的UUID。在第二种方法中,您遇到的问题是用户可能欺骗他的帐户名称和/或更改PC的MAC地址。对于任何方案,你有一个更大的问题,即在用户的PC上安装或运行的任何软件都可能被黑客攻击,用用户想要的东西替换UID。简而言之,你是如果您的用户具有黑客技能和动力,那么就要打一场失败的战斗。)


  

那里有一个可以比这更好的图书馆吗?或者我只是想要太多?

我不知道现有的库会这样做。

答案 2 :(得分:1)

这是一个很好的加密哈希函数的应用程序。最先进的是SHA-2。正如您所做的那样,连接所有独立的数量以一些可重复的方式构建一个字符串,并通过散列运行它以获得一个256位(32字节)的值。

您选择包含操作系统和Java供应商似乎很奇怪,因为这意味着例行升级或更改可能会产生新的ID。根据您给出的标准,MAC,IP和用户名似乎是我的最佳组合。