EliasFarhan/NekoEngine

Que qqn me passe une fourche [Oleg]. (Et qu'on m'impale avec.)

Closed this issue · 2 comments

Je n'ai aucune idée ce qui se passe. Ma seule hypothèse est que le benchmarking de google fout le bordel avec la fonction de hash...
J'ai fait un TEST de hashing et tout fonctionne normalement dedans, mais pas ici...

wtf

Update: C'est apparament à avoir avec l'adresse en memoire de la variable (merci Luca). Faire:

    const size_t key0 = 1;
    const size_t key1 = 1;
    const size_t key2 = 1;
    const auto hash0 = xxh::xxhash<64>(&key0, sizeof(size_t));

    const auto hash1 = xxh::xxhash<64>(&key0, sizeof(size_t));

    for (auto& key : keys)
    {
        key = NextUnsignedLongLong++;
        map.Append(key, NextUnsignedLongLong++);
    }

    const auto hash2 = xxh::xxhash<64>(&key0, sizeof(size_t));

Retourne un hash identique...

Update: j'ai fait un test pour reproduire le comportement:

TEST(Engine, HashingDifferentAddress)
{
    const size_t KEY_VALUE = 1;

    const size_t key0 = KEY_VALUE;
    const size_t key1 = KEY_VALUE;

    const auto hash0 = xxh::xxhash<64>(&key0, sizeof(size_t));
    const auto hash1 = xxh::xxhash<64>(&key1, sizeof(size_t));
    neko_assert(hash0 == hash1, "Same key but different hashes!");
}

Est-ce que j'ai mal compris le fonctionnement de la lib de hashing? Je pensais que tant que la valeur stockée à l'adresse était la même, le hash le serait aussi?

J'ai trouvé le problème en lisant le putain de header -_-

    template <size_t N, typename T> 
    hash_t<N> xxhash(const T* input, size_t len, hash_t<N> seed = 0, endianness endian = endianness::unspecified)
    {
        static_assert(!(N != 32 && N != 64), "You can only call xxhash in 32 or 64 bit mode.");
        return detail::endian_align<N> (static_cast<const void*>(input), len * sizeof(T), seed, mem_ops::get_endian(endian), mem_ops::get_alignment<N>(static_cast<const void*>(input)));
    }

Faut lui passer le nombre d'élements à hasher, pas la taille en bytes d'un seul élement...
Ok, merci je vais aller m'éclater le crane contre un mur mtn bye bye.