Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 为用户创建一个在多次重启时保持不变的唯一编号的最佳方法是什么_Java_Performance - Fatal编程技术网

Java 为用户创建一个在多次重启时保持不变的唯一编号的最佳方法是什么

Java 为用户创建一个在多次重启时保持不变的唯一编号的最佳方法是什么,java,performance,Java,Performance,我正在用java构建一个应用程序,我想为自己提供一些性能测试。我正在计时多个长时间运行的进程,我有一个web服务器,我将使用它来接收指标,但是我想创建一个对特定用户唯一的数字。我的程序不需要登录到计算机上 所以,如果Joe登录到计算机A并运行我的应用程序,它会给他一个像1234这样的唯一号码。然后,如果Jane登录到同一台计算机,它将使用不同的号码,例如4321。然而,如果乔登录到计算机B,它将创建一个完全独立的号码,比如5678。另外,为了澄清,如果Joe重新登录到计算机A,它仍然会生成123

我正在用java构建一个应用程序,我想为自己提供一些性能测试。我正在计时多个长时间运行的进程,我有一个web服务器,我将使用它来接收指标,但是我想创建一个对特定用户唯一的数字。我的程序不需要登录到计算机上

所以,如果Joe登录到计算机A并运行我的应用程序,它会给他一个像1234这样的唯一号码。然后,如果Jane登录到同一台计算机,它将使用不同的号码,例如4321。然而,如果乔登录到计算机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.,所以我将向其中添加一个哈希函数

所以我的问题是,在所有这些宣传之后:这是一个好的方式吗?有没有比这更好的图书馆?还是我想要的太多了

提前感谢您的评论,即使这些评论说:为什么?

您可以使用

在Java中:UUID id=UUID.randomuid

你可以用


在Java中:UUID id=UUID.randomuid

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


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

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


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

您的问题并不完全清楚,因此我将陈述一些假设

您的应用程序安装在用户的PC上。它不是受沙盒限制的小程序或类似程序。 UID由运行在用户计算机上的应用程序生成,而不是由服务器生成。 您不需要能够从UID恢复用户名和机器标识;i、 它只是一个不透明的标识符。 您的解决方案不需要是安全的。如果用户决定在同一台机器上乱搞并生成不同的UID,这其实并不重要。 如果是这样,这里有几个选择

第一次运行应用程序时,生成一个随机UUID并将其存储在用户的主目录或首选项中。随后,在应用程序存储UUID的位置查找现有UUID

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

如果安全性是一个主要问题,那么第一种方法不适用-您必须假设用户可以找到并删除保存的UUID。在第二种情况下,用户可能会伪造其帐户名和/或更改电脑的MAC地址。对于任何方案,您都有一个更大的问题,即用户PC上安装或运行的任何软件都可能被黑客攻击,以用户想要的东西替换UID。简言之,如果你的用户拥有黑客技能和动机,你就是在打一场败仗

有没有比这更好的图书馆?还是我想要的太多了


我不知道现有的库可以做到这一点。

您的问题并不完全清楚,因此我将陈述一些假设

您的应用程序安装在用户的PC上。它不是受沙盒限制的小程序或类似程序。 UID由运行在用户计算机上的应用程序生成,而不是由服务器生成。 您不需要能够从UID恢复用户名和机器标识;i、 它只是一个不透明的标识符。 您的解决方案不需要是安全的。如果用户决定胡闹并生成 同一台机器上有不同的UID,这并不重要。 如果是这样,这里有几个选择

第一次运行应用程序时,生成一个随机UUID并将其存储在用户的主目录或首选项中。随后,在应用程序存储UUID的位置查找现有UUID

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

如果安全性是一个主要问题,那么第一种方法不适用-您必须假设用户可以找到并删除保存的UUID。在第二种情况下,用户可能会伪造其帐户名和/或更改电脑的MAC地址。对于任何方案,您都有一个更大的问题,即用户PC上安装或运行的任何软件都可能被黑客攻击,以用户想要的东西替换UID。简言之,如果你的用户拥有黑客技能和动机,你就是在打一场败仗

有没有比这更好的图书馆?还是我想要的太多了


我不知道现有的库可以做到这一点。

对于会话中的每个用户来说,这不是常数,对吧?:-\。我假设您在客户端发送并保存id。如果不是这样的话,为什么很少有用例。在这种情况下:为什么?比问题中描述的方法真的没那么糟糕。。。当然,除非您需要处理交换IP地址等的用户,否则您必须持久化UUID。但这肯定比查询硬件设备和操作系统更容易、更快。如果客户机的NIC被更换,或者正如Gene指出的那样,您所依赖的任何其他组件都被更改/升级了,该怎么办?这对于会话中的每个用户来说都不是常数,对吧?:-\。我假设您在客户端发送并保存id。如果不是这样的话,为什么很少有用例。在这种情况下:为什么?比问题中描述的方法真的没那么糟糕。。。当然,除非您需要处理交换IP地址等的用户,否则您必须持久化UUID。但这肯定比查询硬件设备和操作系统更容易、更快。如果客户的NIC被更换,或者正如Gene所指出的,您所依赖的任何其他组件都被更改/升级了,该怎么办?您提出了一些很好的观点,并且所有的假设都是正确的。您提出了一些很好的观点,并且所有的假设都是正确的。