Почему хэш-код аргументов в методе 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 [])
Это вернет хеш-код на основе содержимого указанного массива.