Java 一种生成布尔值的函数,该布尔值在计算机之间不同,但不在同一计算机内。可能的
这是一个奇怪的问题。我想编写一个返回true或false的Java函数。对于同一台计算机,它将始终返回true或false,即使程序已从计算机中清除并重新安装(即,不允许任何状态)。它将返回相同的值,无论在程序中调用它的位置、时间、星期二等 我的第二个要求是,对于世界上所有的计算机来说,函数返回的值应该是50/50到30/70。也就是说,至少30%的计算机需要生成不太可能的函数结果 我的第三个要求(棘手的一个)是导致真/假分离的原因对用户来说并不明显。因此,按照操作系统线拆分是不好的,因为这是显而易见的 有什么想法吗Java 一种生成布尔值的函数,该布尔值在计算机之间不同,但不在同一计算机内。可能的,java,random,Java,Random,这是一个奇怪的问题。我想编写一个返回true或false的Java函数。对于同一台计算机,它将始终返回true或false,即使程序已从计算机中清除并重新安装(即,不允许任何状态)。它将返回相同的值,无论在程序中调用它的位置、时间、星期二等 我的第二个要求是,对于世界上所有的计算机来说,函数返回的值应该是50/50到30/70。也就是说,至少30%的计算机需要生成不太可能的函数结果 我的第三个要求(棘手的一个)是导致真/假分离的原因对用户来说并不明显。因此,按照操作系统线拆分是不好的,因为这是显
更新:没错,“同一台电脑”没有太多意义,因为电脑是由可更换的部件组成的。如果更换了一块硬件,则值可以更改。您可以使用系统主机名或ip地址对其进行加密,或者使用随机数发生器的种子
int seed = InetAddress.getLocalHost().hashCode();
// or
int seed = InetAddress.getLocalHost().getHostName().hashCode();
boolean evenRandom = new Random(seed).nextBoolean();
boolean rand_30_70 = new Random(seed).nextInt(100) > 30;
应该注意的是,SecurityManager可以更改此结果或阻止获取主机名。它还可以阻止您获取MAC地址和您可能想要获取的任何其他低级系统信息。Simple。有一个函数f(a,b),其中a表示以前是否在此计算机上执行过此函数,b给出此计算机上的最后一个结果(如果a为false,则为false)。然后,为了得到正确的输入,可以计算f作为?b:(布尔)随机(0或1)。您的规范缺乏特殊性,尤其是在
始终
和同一台计算机的定义中。其他一切都取决于你对这些不变量的假设
让我们假设总是表示“现在”,而同一台计算机表示“当前JVM进程”,这是非常错误的,但说明了这些假设决定了您的第二个和第三个需求的结果
收集某些硬件上的数据,可能是所有硬件上的数据,并基于该硬件数据生成哈希。检测到的硬件定义了同一台计算机
,暗示要求始终
为“现在”
8aca8asad8ae8f8fs8sv8sdfsf8sfs8a8faa
好了,那是我的:)
现在,您可以映射此哈希的最小值和最大值,并相应地分配布尔值
第三个要求是隐蔽性安全,因此,根据定义,“你做错了”;) 最简单的解决方案是只使用mac地址的最后一位返回
根据偶数或奇数判断为真或假。
这将确保在同一台机器上,它总是为一台机器返回相同的值,并且在世界上一半的机器上返回真值
import java.net.*;
/**
*
* @author nick
*/
public class HardwareTruthGen {
//Instance Variables
static InetAddress addr;
static NetworkInterface net;
static byte[] macAddr;
static boolean hardware;
static {
try{
addr = InetAddress.getLocalHost();
net = NetworkInterface.getByInetAddress(addr);
macAddr = net.getHardwareAddress();
//If mac address ends in an even number return true otherwise return false
if((macAddr[(macAddr.length - 1)] % 2) == 0)
hardware = true;
else
hardware = false;
}
catch (Exception ex){
}
}
public static boolean macTrue(){ return hardware;}
}
好吧,让我们戴上我们的虚拟计算机科学帽。要真正能够在没有状态的情况下在机器上重现所需的行为,必须有一个固有的可重复功能。我的第一个想法是检查一些寄存器,然后关闭零位的值,当然不改变它。这可能不够随机,因为这取决于CPU在代码被隐藏之前执行了哪些指令
第二种想法是使用机器的一些固有值,如主机名或CPU-ID,但它们可以更改(主机名),也可能不存在于所有平台上
这时我注意到了“Java”标签,意识到如果你不想编写跨平台的JRI(不要责怪你),或者依赖JRE的内在价值,那么在下一个版本发布或他们更换供应商时,JRE的内在价值可能会发生变化,这可能是一条艰难的道路
您可以使用时钟速度,即使您必须自己进行计时循环,并使用兼容开关来防止JIT编译器/JRE优化例程。这可以给你一个范围的值来打开。没有直接速度;查找特定指令所需的毫秒数,并打开该值是否为奇数/偶数
有更多的事情要尝试,但我越想这个问题,它们就越疯狂。请更新这篇文章,并回答你最终使用的内容。我想知道结果如何。显然,你必须选择对给定计算机(有效)不变的东西。guid使用MAC地址(保证给定网卡的唯一地址),用户实际更换网卡的情况很少。您可以决定如何实际利用它,将其转化为具有所需权重的布尔值。实际上,MAC地址并没有这样的正式保证。大多数网卡都有可能改变MAC地址,虽然在以太网段上有相同的MAC地址会被破坏,但我相信你会发现这种MAC是可变的,实际上是在实际使用中。OP问题不够具体,无法确定这是否是一个问题。是的,我的第一个评论是开玩笑的。现实情况是,你所描述的可能是偶然发生的,而不是设计。畜栏可能是,如果我们知道足够多,以防止/发现这是不受欢迎的行为,我们将有更好的机会为您提供一种方法来故意这样做。定义同一台计算机很棘手。一旦你更换了4次主板,3次存储,两次网卡,但它仍然在相同的情况下,是同一台计算机吗?如果不是,是什么让它以任何代码都可以测量的特定方式成为一台不同的计算机?因此,根据您的编辑,您已经承认(1)是不可能实现的。也许如果你给了我们你试图解决的问题,我们可以提出建议(目前,你提出了一个希望的解决方案,这显然不起作用)这不依赖于随机RNG保持不变吗