gitのソースコードを読んでいると、hashmapを比較する関数にぶち当たった。
/* attr_hashmap comparison function */
static int attr_hash_entry_cmp(void *unused_cmp_data,
const struct attr_hash_entry *a,
const struct attr_hash_entry *b,
void *unused_keydata)
{
return (a->keylen != b->keylen) || strncmp(a->key, b->key, a->keylen);
}
ここで興味深いのは、strncmpで比較する前に、長さを比較しているという点である。長さが同じでない場合は、strncmpの比較を実行せずに、1を返す。
そうでない場合は、strncmpによって比較した結果を返すのである。
二つのハッシュのエントリーが同じだった場合、0を返すべきであるので、利用方法としては、「同じであるか、同じでないか」のみを気にする関数であることが推測できる。
長さが同じでない場合は、必ず1を返すということは、例えば、この二つのハッシュエントリが、「どう違うか」ということを気にする場合には、論理的に整合性が合わないと思う。
(追記)
ここで比較するのは、hashmapのエントリーのキーの文字列同士みたいです。同じキーを探す処理ということで、同じか違うかの判断だけでいいみたいです。
uasiさん
shiracamusさん
ありがとうございました
この関数を引用しているのは、以下の部分である。
/* Initialize an 'attr_hashmap' object */
static void attr_hashmap_init(struct attr_hashmap *map)
{
hashmap_init(&map->map, (hashmap_cmp_fn) attr_hash_entry_cmp, NULL, 0);
}
ここでは、hashmap_cmp_fnの関数の型で、attr_hash_entry_cmpの関数を、hashmap_initの関数に代入している。
hashmap_initについては、hashmap APIの関数の一つで、gitの中には、実装部分はない。 実装は、以下のところにある。
https://github.com/git/git/blob/v2.14.0-rc1/hashmap.c#L153-L169
hashmap APIであることは、以下のところに書いてあった。
http://metaphor.ethz.ch/x/man/git/technical/api-hashmap.html
ちょっとソースコードトレースしても、C言語の構造がよくわからないので、解説はこれ以上できない。
知ってる人がいたら教えて欲しい
C言語は、僕は、各種の言語の中で最も難しいと思う。人によって異論はあるかもしれないが。