unsigned int stupid_hash(char* string)
{
return 1;
}
unsigned int strlen_hash(char* string)
{
return strlen(string);
}
unsigned int mid_ascii_hash(char* string)
{
unsigned int hash_sum = 0;
unsigned int str_len = 0;
while (*string != 0)
{
hash_sum += *(string++);
str_len++;
}
return hash_sum / str_len;
}
unsigned int ascii_sum_hash(char* string)
{
unsigned int hash_sum = 0;
while (*string != 0)
hash_sum += *(string++);
return hash_sum;
}
unsigned int ded_hash(char* string)
{
unsigned int hash_sum = 0;
while (*string != 0)
{
hash_sum ^= *string;
hash_sum = (hash_sum << 1) | (hash_sum >> 31);
++string;
}
return hash_sum;
}
Выборка: ~60000 существующих английских слов
Размер хэш-таблицы: 2017
#define _OPTIMIZATION
Выборка: ~370000 английских слов, над которыми проводятся операции вставки и удаления (см. words.txt)
Размер хэш-таблицы: 59999
Работаем следующим образом:
for (int j = 0; j < 100; ++j)
for (int i = 0; i < size; ++i)
if((i + j) % 2)
hash_map.insert(words_array[i]);
else
hash_map.remove(words_array[i]);
#define _ASM
unsigned int ded_hash(char* string)
{
_asm
{
mov ebx, string
xor eax, eax
xor edx, edx
_loop :
mov dl, [ebx]
xor eax, edx
rol eax, 1
inc ebx
cmp[ebx], 0
jne _loop
}
}
Полученные коэффициенты ускорения(абсолютное время до оптимизации / абсолютное время после оптимизации)
Оптимизация | Od | -O1 | -O2 |
Коэффициент | 1,79 | 1,39 | 0,93 |