SELinuxで使われてるハッシュ関数

というわけで、avtab向けの
ハッシュ関数をなんとかするよう言われたので、考えてみる。

使われてるハッシュ関数は↓

#define AVTAB_HASH(keyp) \
*1 & \
AVTAB_HASH_MASK)

target_class,
target_type,
source_type
とも、16ビット。
これを適当にシフトさせて足してるだけ。
AVTAB_HASH_MASKで、上限を超えないように調整。
確かに早そうだが。


偏りもあるかも。例えば、
下位2bitは、
target_class(オブジェクトクラス)のものをそのまま持ってきてる。

オブジェクトクラスは、

#define SECCLASS_SECURITY 1
#define SECCLASS_PROCESS 2
#define SECCLASS_SYSTEM 3
#define SECCLASS_CAPABILITY 4
#define SECCLASS_FILESYSTEM 5
#define SECCLASS_FILE 6
#define SECCLASS_DIR 7
#define SECCLASS_FD 8
#define SECCLASS_LNK_FILE 9

な感じ。
出現頻度が高いのは、FILE,DIR,LNK_FILEと思われる。
これらの、下位2ビットは、10, 11, 01か。
下位2ビットが「00」なハッシュスロットはあまり使われないことになる。
単純に、3つの要素の順番を入れ替えたり、シフトビット数を変えるだけでも効果があるかもしれない?

linux/jhash.h, linux/hash.hに、ちゃんとしてそうなハッシュ関数が定義されてるが、
これより複雑だなぁ。遅くなるとか言われないか。

*1:keyp->target_class + \ (keyp->target_type << 2) + \ (keyp->source_type << 9