Имеет хорошая хеш-функция для хеш-таблицы C++?

const carbs_value = [
{ _id : "someval", quantity: 22, item: "val", carbs: 30},
{ _id : "someval", quantity: 22, item: "val", carbs: 3},
{ _id : "someval", quantity: 22, item: "val", carbs: 350},
{ _id : "someval", quantity: 22, item: "val", carbs: 630},
];

const allowed = ['carbs'];

const filtered = carbs_value.map(e=> Object.keys(e)
  .filter(key => allowed.includes(key))
  .reduce((obj, key) => {
    obj[key] = e[key];
    return obj;
  }, {})   );
  
  console.log(filtered);
  
  
console.log("So now you can select an element:");
  
   console.log(filtered[0]);
   console.log(filtered[1]);

34
задан Bill the Lizard 15 September 2012 в 02:49
поделиться

8 ответов

Теперь принятие Вас хочет хеш и хочет что-то сверкание быстро , который работал бы в Вашем случае, потому что Ваши строки являются всего 6 символами долго, Вы могли использовать это волшебство:

size_t precision = 2; //change the precision with this
size_t hash(const char* str)
{
   return (*(size_t*)str)>> precision;
}

CRC для копуш;)

Объяснение: Это работает путем кастинга содержания указателя строки, чтобы быть похожим" на size_t (int32 или int64 на основе оптимального соответствия для аппаратных средств). Таким образом, содержание строки интерпретируется как необработанное число, никакое беспокойство о символах больше и Вас тогда сдвиг разряда это необходимая точность (Вы настраиваете это число к лучшей производительности, я нашел 2 работы хорошо для хеширования строк в наборе нескольких тысяч).

Также действительно аккуратная часть является любым достойным компилятором на современных аппаратных средствах, хеширует строку как это в 1 инструкции по сборке, трудно для избиения этого;)

24
ответ дан 27 November 2019 в 16:53
поделиться

Повышение. Функциональный / Хеш мог бы быть полезен для Вас. Я не попробовал его, таким образом, я не могу ручаться за его производительность.

Повышение также имеет библиотека CRC .

я посмотрел бы Повышение. Незаказанный первый (т.е. повышение:: unordered_map<>). Это использует карты хеша вместо двоичных деревьев для контейнеров.

я полагаю, что некоторые реализации STL имеют hash_map<> контейнер в stdext пространстве имен.

6
ответ дан 27 November 2019 в 16:53
поделиться

Этот простой многочлен работает удивительно хорошо. Я получил его от Paul Larson из Microsoft Research, который изучил большое разнообразие множителей хеша и хеш-функций.

unsigned hash(const char* s, unsigned salt)
{
    unsigned h = salt;
    while (*s)
        h = h * 101 + (unsigned) *s++;
    return h;
}

salt должен быть инициализирован приблизительно к случайным образом выбранное значение, прежде чем хеш-таблица будет создана для защиты от нападения хэш-таблицы . Если это не проблема для Вас, просто используйте 0.

размер таблицы важен также, для уменьшения коллизий. Кажется, что Ваш прекрасен.

13
ответ дан 27 November 2019 в 16:53
поделиться

приоритет номер один моей хэш-таблицы является быстрым поиском (извлечение).

Хорошо тогда Вы используете правильную структуру данных, поскольку ищущий в хэш-таблице O (1)!:)

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

2
ответ дан 27 November 2019 в 16:53
поделиться

Так как Вы храните английские слова, большинство Ваших символов будет буквами и не будет большой вариации в старших значащих двух битах Ваших данных. Кроме того, этого я сохранил бы это очень простым, просто с помощью XOR. В конце концов, Вы не ищете криптографическую силу, но только для довольно ровного распределения. Что-то вдоль этих строк:

size_t hash(const std::string &data) {
  size_t h(0);
  for (int i=0; i<data.length(); i++)
    h = (h << 6) ^ (h >> 26) ^ data[i];
  }
  return h;
}

, Кроме того, этого, посмотрите на Вас станд.:: tr1:: хешируйте как хеш-функция и/или станд.:: tr1:: unordered_map как реализация хэш-таблицы? Используя их, вероятно, было бы сохранение много работы, настроенной против реализации Ваших собственных классов.

4
ответ дан 27 November 2019 в 16:53
поделиться

Как насчет чего-то простого:

// Initialize hash lookup so that it maps the characters
// in your string to integers between 0 and 31
int hashLookup[256];

// Hash function for six character strings.
int hash(const char *str)
{
    int ret = 0, mult = 1;
    for (const char *p = str; *p; *p++, mult *= 32) {
        assert(*p >= 0 && *p < 256);
        ret += mult * hashLookup[*p];
    }

    return ret;
}

Это принимает 32 бита ints. Это использует 5 битов за символ, таким образом, значение хэш-функции только имеет 30 битов в нем. Вы могли зафиксировать это, возможно, путем генерации шести битов для первого или двух символов. Если Вы, набор символов является достаточно небольшим, Вам, возможно, не понадобились бы больше чем 30 битов.

2
ответ дан 27 November 2019 в 16:53
поделиться

Если необходимо искать короткие строки, и вставка не является проблемой, возможно, Вы могли использовать B-дерево или дерево 2-3, Вы не получаете много путем хеширования в случае.

способ, которым Вы сделали бы это, путем размещения буквы в каждый узел, таким образом, Вы сначала проверяете на узел "a", тогда Вы проверяете "a" дочерние элементы на "p", и это - дети для "p", и затем "l" и затем "e". В ситуациях, где Вы имеете "яблоко" и "применяете" Вас, должен искать на последний узел, (так как единственная разница находится в последнем "e" и "y")

, Но но в большинстве случаев Вы будете в состоянии получить слово после всего нескольких шаги ("ксилофон" => "x"-> "ylophone"), таким образом, можно будет оптимизировать как это. Это может быть быстрее, чем хеширование

2
ответ дан 27 November 2019 в 16:53
поделиться

Размер Вашей таблицы продиктует, какой хеш размера необходимо использовать. Требуется минимизировать коллизии, конечно. Я не уверен, что Вы определяете макс. объектами и способностью (они походят на то же самое мне), В любом случае, любое из тех чисел предполагает, что хеш на 32 бита был бы достаточен. Вам мог бы сойти с рук CRC16 (~65 000 возможностей), но у Вас, вероятно, будет много коллизий для контакта с. С другой стороны, коллизия может быть более быстрой для контакта с, чем, чем хеш CRC32.

я сказал бы, пойдите с CRC32. Вы не найдете нехватки документации и примера кода. Так как Вам выяснили Ваши максимумы, и скорость является приоритетом, пойдите с массивом указателей. Используйте хеш для генерации индекса. На коллизии, инкрементный индекс, пока Вы не поражаете пустой блок.. быстрый и простой.

4
ответ дан 27 November 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: