Как создать нечувствительный к регистру Glib Hash Table? - PullRequest
1 голос
/ 09 августа 2009

Есть ли какой-нибудь простой способ создания нечувствительной к регистру (String -> String) Glib Hash Table?

Результат должен соответствовать этому:

GHashTable *table;
//there should be definition of table

g_hash_table_insert(table, "KeY", "Something"); //insert

//every command should return the line in table
g_hash_table_lookup(table, "Key");
g_hash_table_lookup(table, "KEY");
g_hash_table_lookup(table, "key");
g_hash_table_lookup(table, "KeY");

Я думаю, что проблема только в определении хеш-функции и функции сравнения. Однако я не знаю, какие функции мне следует использовать.

Ответы [ 2 ]

4 голосов
/ 09 августа 2009

Предоставьте свои собственные функции равенства и хеш-функции для g_hash_table_new вместо g_str_equal и g_str_hash.

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

Пока вам нужно беспокоиться только о строках ASCII, вы можете почти (но не совсем) использовать g_ascii_strcasecmp для функции равенства. Вам необходимо настроить возвращаемое значение. Если вы хотите поддерживать больший набор символов, используйте для этого набора сравнение без учета регистра.

3 голосов
/ 09 августа 2009

Почему бы вам просто не преобразовать ключ, используя что-то вроде tolower()? Таким образом, ключ стандартизирован, и, следовательно, ваша хеш-таблица тоже будет.

...