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