Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Не так надежно уникальный как сам GUID, нет.
Только для расширения Вы уменьшаете свою уникальность фактором 4, идя от 16 байтов до 4 байтов возможных комбинаций.
, Как указано в комментариях размер хэша будет иметь значение. 4-байтовой вещью было предположение, ужасное в лучшем случае, я знаю, что она может использоваться в.NET, где размер хэша по умолчанию составляет 4 байта (интервал). Таким образом, можно заменить то, что я сказал выше с любым размером байта хеш может быть.
Нет.
Видят здесь, если Вы хотите мини-GUID: http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Одним словом, нет.
Позволяют нам предположить, что Ваш хеш имеет меньше битов, чем GUID, принципом дыры голубя, там должен существовать больше чем одно отображение некоторого GUID-> хеш просто, потому что существует меньше хешей, чем ГУИДЫ.
, Если мы предполагаем, что хеш имеет большее число битов, чем GUID, существует очень маленькое - но конечный - шанс коллизии, принимая Вы используете хорошую хеш-функцию.
Никакая хеш-функция, которая уменьшает произвольный размерный блок данных до числа фиксированного размера битов, не произведет 1 к 1 отображение между двумя. Там будет всегда существовать шанс наличия двух различных блоков данных быть уменьшенным до той же последовательности битов в хеше.
Хорошие хеш-алгоритмы минимизирует вероятность этого случая, и обычно, чем больше битов в хеше, тем менее случайный из коллизии.
Это не guranteed, чтобы быть, из-за хэш-коллизии . Сам GUID, как почти гарантируют, будет.
По практическим причинам, вероятно, можно ли предположить, что хеш уникален, но почему бы не использовать сам GUID?
Нет, и я не принял бы уникальности никакого значения хэш-функции. Это не должно иметь значения, потому что для значений хэш-функции не нужно к уникальному, им просто нужно к равномерно распределенному через их диапазон. Чем более ровный распределение, тем меньше коллизий происходит (в хеш-таблице). Меньше коллизий означает лучшую производительность хеш-таблицы.
к вашему сведению Для хорошего описания того, как хэш-таблицы работают, прочитайте принятый ответ на , Что такое хеш-таблицы и hashmaps и их типичные варианты использования?
При использовании криптографического хеша (MD5, SHA1, RIPEMD160), хеш будет уникален (коллизии по модулю, которые являются очень невероятными - SHA1 используется, например, для цифровых подписей, и MD5 является также стойким к коллизии на случайные исходные данные ). Хотя, почему Вы хотите хешировать GUID?