С Функции хеширования до конца :
MurmurHash стал довольно популярным, по крайней мере в кругах разработчиков игр, как «общая хэш-функция».
Это хороший выбор, но давайте посмотрим позже, сможем ли мы в целом добиться большего успеха. Другой хороший выбор, особенно если вы знаете больше о своих данных, чем «это будет неизвестное количество байтов», - это бросить свои собственные (например, см. Ответы Вон Чуна или модифицированный xxHash / Murmur Руны, который специализируется на 4-байтовых ключах). так далее.). Если вы знаете свои данные, всегда пытайтесь понять, можно ли использовать эти знания для достижения хорошего эффекта!
Без дополнительной информации я бы порекомендовал MurmurHash в качестве общего назначения некриптографическая хеш-функция . Для небольших строк (размером среднего идентификатора в программах) очень хороши очень простые и известные djb2 и FNV .
Здесь (размеры данных <10 байтов) мы можем видеть, что интеллектуальность ILP других алгоритмов не дает себя проявить, и супер-простота FNV или djb2 выигрывает в производительности. </p>
unsigned long
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
hash = FNV_offset_basis
for each byte_of_data to be hashed
hash = hash × FNV_prime
hash = hash XOR byte_of_data
return hash
hash = FNV_offset_basis
for each byte_of_data to be hashed
hash = hash XOR byte_of_data
hash = hash × FNV_prime
return hash
Примечание о безопасности и доступности
Хэш-функции могут сделать ваш код уязвимым для атак типа "отказ в обслуживании". Если злоумышленник может заставить ваш сервер обрабатывать слишком много коллизий, он может не справиться с запросами.
Некоторые хэш-функции, такие как MurmurHash , принимают начальное число, которое вы можете предоставить, чтобы значительно снизить способность злоумышленников прогнозировать хэши, которые генерирует ваше серверное программное обеспечение. Имейте это в виду.