#pragma once #include "../types.hpp" #include #include namespace sibs { const usize PUBSUB_KEY_LENGTH = 32; // Source: https://stackoverflow.com/a/11414104 (public license) static size_t fnvHash(const unsigned char *key, int len) { size_t h = 2166136261; for (int i = 0; i < len; i++) h = (h * 16777619) ^ key[i]; return h; } class PubsubKey { public: PubsubKey(); // Create pubsub key from existing data, data will be cutoff at PUBSUB_KEY_LENGTH. If @size is less than PUBSUB_KEY_LENGTH then data is appended with 0 PubsubKey(const void *data, const usize size); bool operator == (const PubsubKey &other) const; bool operator != (const PubsubKey &other) const; std::array data; }; struct PubsubKeyHasher { size_t operator()(const PubsubKey &pubsubKey) const { return fnvHash((const unsigned char*)pubsubKey.data.data(), PUBSUB_KEY_LENGTH); } }; template using PubsubKeyMap = std::unordered_map; }