Почему хэш-код аргументов в методе main ограничен только некоторыми наборами значений?

У меня есть программа, которой нужно только одно случайное число, случайное число может быть небезопасным, поэтому я пытаюсь использовать хэш-код аргументов в качестве случайного числа, поскольку оно не требует каких-либо дополнительных операторов импорта:

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

и даже я добавил некоторые значения в аргументы (например, java Test abc), аналогичные наборы значений по-прежнему появляются, в чем причина?

2 ответа

Ты звонишь hashCode() на массиве. Массивы не переопределяют hashCode(), equals() или же toString() - так вы получаете результат, который вообще не зависит от содержимого массива и, вероятно, зависит от того, где он находится в памяти. Если вам нужен хеш-код в зависимости от значений в массиве, вы можете вызвать Arrays.hashCode(args) - но тогда вы всегда получите один и тот же результат для одного и того же ввода, что не является вашим намерением.

Теперь, что касается вашей цели:

У меня есть программа, которой нужно только одно случайное число, случайное число может быть небезопасным, поэтому я пытаюсь использовать хэш-код аргументов в качестве случайного числа, поскольку оно не требует каких-либо дополнительных операторов импорта

Это ужасная, ужасная причина для решения использовать что-то... и хеш-коды никогда не должны использоваться в качестве генераторов случайных чисел.

Если вы действительно, действительно не хотите добавлять оператор импорта (а почему бы и нет?), Просто используйте Random в явном виде:

int x = new java.util.Random().nextInt(100); // Or whatever

Метод hashCode java.lang.Array унаследован от Object, что означает, что хеш-код зависит от ссылки. Чтобы получить хеш-код на основе содержимого массива, используйте `

Arrays.hashCode (INT [])

Это вернет хеш-код на основе содержимого указанного массива.

Другие вопросы по тегам