为什么main方法中args的哈希码仅限于某些值集?

时间:2016-03-10 06:51:04

标签: java random main hashcode args

我有一个只需要一个随机数的程序,随机数可能不安全,所以我试图使用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),仍会出现类似的值集,原因是什么?

2 个答案:

答案 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 [])

这将返回基于指定数组内容的哈希码。