#c #hash #stl #unordered-set
Вопрос:
Можно ли получить хэш из произвольного экземпляра с помощью std::hash вместо crc_mem?
static uint32_t crc_table[16] = { 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; unsigned long crc_update(unsigned long crc, byte data) { byte tbl_idx; tbl_idx = crc ^ (data gt;gt; (0 * 4)); crc = crc_table[tbl_idx amp; 0x0f] ^ (crc gt;gt; 4); tbl_idx = crc ^ (data gt;gt; (1 * 4)); crc = crc_table[tbl_idx amp; 0x0f] ^ (crc gt;gt; 4); return crc; } unsigned long crc_mem(char* s, int n) { unsigned long crc = ~0L; for (int i = 0; i lt; n; i ) { crc = crc_update(crc, s[i]); } crc = ~crc; return crc; } size_t my_struct::GetChecksum() const { return crc_mem((char*)this, sizeof(*this)); }
Я хочу использовать этот хэш для неупорядоченной карты, например, std::неупорядоченная карта lt;my_struct, intgt; map1;
Комментарии:
1. Вы можете добавить специализации
std::hash
для своих собственных типов.2. «..экземпляр произвольной структуры…» — нет, потому что любая произвольная функция хэширования попытается хэшировать данные заполнения (поскольку в C нет отражения). Поскольку заполнение не определено, две в остальном идентичные структуры могут создавать разные хэши. У Boost есть несколько вспомогательных функций для объединения хэшей, и вы можете использовать их для объединения хэшей каждого члена структуры, составляющих ее идентичность.