Применяется принцип "голубиного отверстия".
Если у вас есть 4 голубиных отверстия и 5 голубей, которые должны найти голубиную лунку для ночлега, то хотя бы в одной голубиной лунке будет больше одного голубя. это.
Очевидно, верно?
То же самое применимо и здесь. Есть только 2^32
различных голубиных отверстий га sh кодов (поскольку значение int
, int в java определяется как 32-битное число, таким образом, только 2 ^ 32 различные возможные значения выхода). Это большое, большое число. около 4 млрд.
Однако в java spe c нет ничего, что указывало бы на то, что когда-либо может существовать не более 4 миллиардов голубей объектов. Если существует более 4 миллиардов объектов, ни один алгоритм, который можно было бы разработать, никогда не мог бы пообещать уникальности из-за этого принципа. КЭД.
NB. Вы также можете использовать принцип квадратного отверстия, чтобы доказать, что универсальный компрессор (инструмент, который может сжимать все, что гарантирует, что сжатый результат всегда меньше или равен) не может существовать, пока он на самом деле что-то сжимает, то, как следствие, должен быть некоторый поток битов, для которого компрессор фактически создает файл большего размера . Вы можете использовать его, чтобы доказать, что (int) (Math.random() * 10)
не совсем равномерная случайная величина, и почему вы должны поэтому использовать random.nextInt(10)
вместо этого (что есть). Это удивительно полезный принцип, чтобы доказать что-то в компьютерных науках!
Теперь можно представить систему кодирования на основе int
, которая обещает уникальные коды до , когда вы попадете в 4 миллиарда уникальных объектов, но сделаете такое обещание невероятно сложно и само по себе является проблемой памяти, если бы оно работало для всех без исключения объектов.
Java не дает таких обещаний, и, как следствие, System.iHC
не гарантированно будет иметь либо уникальные числа (абсолютно невозможно дать такое обещание), либо то, что System.iHC
имеет «идеальное» распределение (хеш-коды распределены настолько, насколько они могли бы быть, то есть не использовать повторно, пока не существует 4 миллиарда объектов одновременно). Обратите внимание, что «существует» уже сложно: когда объект действительно «исчезает»?
На практике iH C основан на позициях памяти; это очень хорошее распределение. Но есть разница между , очень маловероятно, что любые 2 объекта когда-либо будут иметь одинаковый хэш-код идентификатора и , мы гарантируем, что никакие два объекта не будут иметь идентификаторы ha sh code .