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]);
Теперь принятие Вас хочет хеш и хочет что-то сверкание быстро , который работал бы в Вашем случае, потому что Ваши строки являются всего 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 инструкции по сборке, трудно для избиения этого;)
Повышение. Функциональный / Хеш мог бы быть полезен для Вас. Я не попробовал его, таким образом, я не могу ручаться за его производительность.
Повышение также имеет библиотека CRC .
я посмотрел бы Повышение. Незаказанный первый (т.е. повышение:: unordered_map<>). Это использует карты хеша вместо двоичных деревьев для контейнеров.
я полагаю, что некоторые реализации STL имеют hash_map<> контейнер в stdext пространстве имен.
Этот простой многочлен работает удивительно хорошо. Я получил его от 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.
размер таблицы важен также, для уменьшения коллизий. Кажется, что Ваш прекрасен.
приоритет номер один моей хэш-таблицы является быстрым поиском (извлечение).
Хорошо тогда Вы используете правильную структуру данных, поскольку ищущий в хэш-таблице O (1)!:)
CRC32 должен сделать прекрасный. Реализация не состоит в том, что комплекс, это главным образом основано на XORs. Просто удостоверьтесь, что это использует хороший многочлен.
Так как Вы храните английские слова, большинство Ваших символов будет буквами и не будет большой вариации в старших значащих двух битах Ваших данных. Кроме того, этого я сохранил бы это очень простым, просто с помощью 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 как реализация хэш-таблицы? Используя их, вероятно, было бы сохранение много работы, настроенной против реализации Ваших собственных классов.
Как насчет чего-то простого:
// 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 битов.
Если необходимо искать короткие строки, и вставка не является проблемой, возможно, Вы могли использовать B-дерево или дерево 2-3, Вы не получаете много путем хеширования в случае.
способ, которым Вы сделали бы это, путем размещения буквы в каждый узел, таким образом, Вы сначала проверяете на узел "a", тогда Вы проверяете "a" дочерние элементы на "p", и это - дети для "p", и затем "l" и затем "e". В ситуациях, где Вы имеете "яблоко" и "применяете" Вас, должен искать на последний узел, (так как единственная разница находится в последнем "e" и "y")
, Но но в большинстве случаев Вы будете в состоянии получить слово после всего нескольких шаги ("ксилофон" => "x"-> "ylophone"), таким образом, можно будет оптимизировать как это. Это может быть быстрее, чем хеширование
Размер Вашей таблицы продиктует, какой хеш размера необходимо использовать. Требуется минимизировать коллизии, конечно. Я не уверен, что Вы определяете макс. объектами и способностью (они походят на то же самое мне), В любом случае, любое из тех чисел предполагает, что хеш на 32 бита был бы достаточен. Вам мог бы сойти с рук CRC16 (~65 000 возможностей), но у Вас, вероятно, будет много коллизий для контакта с. С другой стороны, коллизия может быть более быстрой для контакта с, чем, чем хеш CRC32.
я сказал бы, пойдите с CRC32. Вы не найдете нехватки документации и примера кода. Так как Вам выяснили Ваши максимумы, и скорость является приоритетом, пойдите с массивом указателей. Используйте хеш для генерации индекса. На коллизии, инкрементный индекс, пока Вы не поражаете пустой блок.. быстрый и простой.