LoginSignup
1
1

More than 5 years have passed since last update.

gitのソースコードを読んでいると、hashmapを比較する関数にぶち当たった

Last updated at Posted at 2017-08-03

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言語は、僕は、各種の言語の中で最も難しいと思う。人によって異論はあるかもしれないが。

1
1
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1