Получение хэша из экземпляра произвольной структуры

#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 есть несколько вспомогательных функций для объединения хэшей, и вы можете использовать их для объединения хэшей каждого члена структуры, составляющих ее идентичность.