Создайте хеш-ключ uint64_t с несколькими целыми числами uint32_t - PullRequest
0 голосов
/ 25 июня 2010

Я столкнулся с той же проблемой, что и Эдуардо ( Генерация хэш-суммы для нескольких целых чисел ), но моя немного отличается, как сказано в названии.

У меня четыре 32-битныхцелые числа и мне нужно сгенерировать уникальный ключ 64 бит.На данный момент я сгенерировал конкатенацию строк из целых четверок, разделенных символом '/', а затем сгенерировал CRC со строкой.

char id_s[64];
sprintf(id_s, "%d/%d/%d/%d", a, b, c, d);
uint64_t id = CRC(id_s);

Но проблема в том, что мне нужно сделатьэто несколько миллионов раз, так что, похоже, он сильно загружает процессор.Поэтому я думал о прямом сохранении четырех целых чисел в одно целое число.

Это можно легко сделать, если четыре целых числа имеют целые числа 16 бит.Это можно сделать, используя оператор сдвига битов.

uint64_t id = a << 48 + b << 32 + c << 16 + d;

С четырьмя 32-битными целыми числами мне нужно сложить 128 бит в одно 64-битное целое.

Есть ли у кого-нибудь предложения?

Ответы [ 2 ]

2 голосов
/ 25 июня 2010

Я думаю, что вам лучше всего использовать xor:

  uint64_t makeId(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
  {
     uint64_t id = a;
     id <<=11;
     id ^= b;
     id <<=11;
     id ^= c;
     id <<=10;
     id ^=d;

     return id;
  }

Это будет работать достаточно хорошо, если ваши входы хорошо распределены и используют все 32 бита.Как сказал Марк, вы не можете превратить 128 бит в 64 бит без дублирования.

1 голос
/ 25 июня 2010

В зависимости от характера ваших входных данных, что-то похожее на то, что вы предложили, может нормально работать:

uint64_t id = static_cast<uint64_t>(a & 0xFFFFu) << 48 + static_cast<uint64_t>(b & 0xFFFFu) << 32 + static_cast<uint64_t>(c & 0xFFFFu) << 16 + static_cast<uint64_t>(d & 0xFFFFu);

Пока верхние биты значений довольно постоянны, а младшие биты относительно случайны, это должно вас сблизить. Вы пытаетесь втиснуть 128 бит данных в 64 бит, поэтому вам нужно где-то выбросить данные. Вопрос только в том, какие биты отбрасывать и как вы это делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...