J'ai besoin de hachages ~ 15000 entiers non signés qui sont échantillonnés à partir de l'espace de 2^12 sur le bas, jusqu'à 2^32 sur le haut de gamme. J'ai également besoin de stocker l'index pour une recherche inversée. Un exemple naïf en utilisant STL C++ serait:Le type le plus rapide de la table de hachage
std::map<unsigned int, std::set<unsigned int /* unique indices */> > m;
Dans le cas dense, on pourrait penser à cela comme:
std::vector<std::set<unsigned int /* unique indices */> > v;
Maintenant le problème. La vitesse est le facteur le plus important ici, mais je suis encore limité en termes de mémoire: je vais devoir stocker 1000 de ces cartes en mémoire et accéder à un débit élevé dans une application à faible latence. Je stocke actuellement les données en utilisant la méthode dense, mais je voudrais augmenter la gamme de clés qui doivent être hachées à 2^32 ce qui rend la méthode dense problématique. Sur le plan positif, une fois la carte créée, je n'y insèrerai plus rien, je ne l'interrogerai que plus tard, les insertions doivent toujours être assez rapides. , mais pas aussi critique que la requête
Une partie du code que j'ai expérimenté sont:
Google sparsehash
Google DenseHash
STL unordered_map
STL carte
Je ne me dérange pas d'écrire ma propre table de hachage. Je voulais obtenir des conseils d'experts avant de m'y attaquer moi-même.
Voulez-vous dire qu'aucune des bibliothèques existantes n'est assez rapide? –
La version dense est assez rapide. Cependant, il consomme beaucoup de mémoire lorsque les clés sont échantillonnées à partir d'un espace de 2^32 ou plus. – paul
J'aimerais savoir s'il y a des astuces que je peux utiliser si je sais que la carte ne changera pas après sa construction. – paul