У вас нет для использования strncmp()
, когда нужно различать только несколько строк:
#include <stdio.h>
#include <stdint.h>
#include <string.h>
static uint32_t method_hash(const char *key)
{
int len;
uint32_t hash;
int i;
len = strlen(key);
for (hash = 0, i = 0; i < len; i++) {
hash += (unsigned int) key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Usage: %s <method>\n", argv[0]);
return 0;
}
switch(method_hash(argv[1])) {
case 802187597:
printf("Its GET\n");
break;
case 740659500:
printf("Its POST\n");
break;
default:
printf("Its RUBBISH\n");
return 1;
}
return 0;
}
Обратите внимание, что хеш не защищен от коллизий, ноподходит, чтобы узнать разницу между GET и POST.Я часто использую этот маленький драгоценный камень в словарях, вызывая strncmp()
только тогда, когда я думаю У меня есть совпадение.
Я отправляю этот ответ, чтобы сказать вам, что есть много способовразбирайтесь со строками, надеясь, что вы избежите кода, который выглядит следующим образом, поскольку вы продолжаете изучать C:
if (! strncmp(string, "FOO ", 4)) {
do_this();
} else if (! strncmp(string, "BAR ", 4)) {
do_that();
} else if (! strncmp(string, "FOOBAR ", 7)) {
do_both();
/* ... madness ensues through 200 more lines and 100 more else if's ... */
} else {
return 0;
}
Мой пример не совсем верен.Вы бы хотели, чтобы значения хеш-функции определялись во время выполнения, а не просто включали известные значения, если вы хотите, чтобы код был переносимым.Это упражнение для читателя (подсказка, переключение регистров требует постоянных).