我有一个只需要一个随机数的程序,随机数可能不安全,所以我试图使用args的哈希码作为随机数,因为它不需要任何额外的import语句:
public class Test{
public static void main(String[] args){
int r=args.hashCode();
System.out.println(r);
}
}
但在我运行20次之后,我发现args的哈希码看起来不那么随机:
1265744841
745503977
745503977
400535505
1265744841
745503977
745503977
745503977
1265744841
1265744841
745503977
1265744841
1586482837
1265744841
56264551
745503977
745503977
745503977
400535505
1265744841
它看起来有些值反复出现,我尝试重新启动机器并再次运行程序20次,某些值仍然重复出现,有些值甚至与重启前的值相同:
745503977
745503977
745503977
745503977
745503977
400535505
745503977
745503977
745503977
745503977
745503977
745503977
745503977
1265744841
745503977
745503977
745503977
745503977
745503977
1265744841
甚至我在args中添加了一些值(例如:javaa test abc),仍会出现类似的值集,原因是什么?
答案 0 :(得分:3)
你在数组上调用hashCode()
。数组不会覆盖hashCode()
,equals()
或toString()
- 因此您获得的结果完全不依赖于数组的内容 ,可能取决于它在内存中的位置。如果你想要一个哈希码,取决于数组中的值,你可以调用Arrays.hashCode(args)
- 但是你总是得到相同输入的相同结果,这不是你的意图。
现在,至于目的:
我有一个只需要一个随机数的程序,随机数可能不安全,所以我试图使用args的哈希码作为随机数,因为它不需要任何额外的import语句
决定使用某种东西是一个可怕的,可怕的理由......哈希码应该从不用作随机数生成器。
如果你真的,真的不想添加一个import语句(为什么不呢?)只需明确使用Random
:
int x = new java.util.Random().nextInt(100); // Or whatever
答案 1 :(得分:0)
java.lang.Array hashCode方法继承自Object,这意味着hashcode取决于引用。要根据数组的内容获取哈希码,请使用“
Arrays.hashCode(INT [])
这将返回基于指定数组内容的哈希码。