Я думаю, для какого приложения вы используете хеш-функцию, это важное различие. Например, частые столкновения в контейнерах хэширования могут ухудшить производительность. Частые столкновения в криптографии будут иметь гораздо более разрушительные последствия (см .: криптографическая хеш-функция в Википедии ).
Столкновение происходит относительно легко, даже с «приличным» алгоритмом хеширования. Например, в Java
String s = new String(new char[size]);
всегда хэшируется в 0. То есть все строки, содержащие только \0
хэшируются в 0 в Java.
Что касается «имеет ли значение, каким контейнером он будет?», Опять же, это зависит от приложения. Вы можете создавать хеш-функции, которые бы хэшировали «похожие» объекты с близлежащими значениями. Это полезно, например, если вы хотите искать похожие объекты. Просто хэш их всех и посмотреть, где они падают. В этом случае, столкновения или почти столкновения желательны, потому что это группирует объекты, которые похожи.
В других приложениях вы хотите, чтобы даже малейшее изменение объекта приводило к совершенно другому значению хеша. Это имеет место, например, в криптографии, когда вы хотите быть максимально уверенными в том, что что-то не было изменено. В этом случае гораздо труднее найти разные объекты, которые хэшируют одно и то же значение.