Добрый день! До сих пор не пользовался хэш таблицами, но когда стало нужно, у меня возник вопрос:
Почему нельзя пользоваться такой хэш функцией?
template <class T>
int my_hash(const T& p)
{
T* pi = new T(p);
uint32_t x = reinterpret_cast<uint32_t>(pi);
return x % 105;
}
Пользоваться можно, вот только результат будет немного не предсказуем. Хеш функция должна для одинаковых объектов выдавать одинаковые значения. Для разных - желательно. Ваша функция не зависит от внутреннего устройства объекта. Более того, даже два одинаковых объекта скорее всего будут иметь разный разный хеш (если только это не один и тот же указатель).
Общее требование - хеш должен зависеть только от хешируемого значения, и обязан совпадать для одинаковых значений. Иначе не будет работать сам принцип хеширования!
Ваш хэш, по большому счету, ничем не отличается от взятия произвольного случайного числа в качестве хэша. Уж лучше вы бы для всех значений брали одно и то же число, скажем, 0 - имели бы линейный список, который по крайней мере медленно, но корректно работал. В отличие от вашего варианта, который работать не будет вовсе...
Не понятно, что значит ваше "нельзя".
Во-первых, этой функцией "нельзя" пользоваться потому, что она на первый взгляд содержит грубую утечку памяти. Но это "нельзя" к хешированию никакого отношения не имеет. (Можно предположить, что конструктор типа T
таки предотвращает утечку, но это уже домыслы.)
Во-вторых, вопрос в том, что именно вы хотите хешировать. Значение указателя? Значение указуемого объекта? Эта функция пытается хешировать значение [утекающего] указателя. В хешировании указателей ничего плохого нет - это нередко бывает нужно. Но кому и зачем может понадобиться хешировать утекающие указатели? Однако если по какой-то специальной причине это именно то, что вам нужно, то такой функцией пользоваться "можно".
В-третьих, эта функция хеширует значение указателя, но делает это некачественно. В качественной функции хеширования каждый бит хеша должен зависеть от каждого значащего бита хешируемого значения. Ваша функция же полностью игнорирует старшие биты хешируемого указателя. Эта функция хеширования некачественна, и с этой точки зрения ее использовать "нельзя".
То есть, если предположить, что проблема утечки памяти решена за кулисами, то у вас получилась странная и некачественная, но формально корректная функция хеширования указателя, которой "можно" пользоваться. А уж что именно вы хотели получить - известно только вам.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь подключить другие cpp файлыПри добавлении выдает ошибки:
В какой момент времени во время исполнения произойдет присвоение int a = 5?