windows 内核对象hash 算法

WINDOWS中有20几类无数的内核对象,它们都独立地存在于系统地址空间中。系统利用目录对象将所有的这些对象组织起来。目录对象是一个有37个数组元素组成的哈希(HASH)树。数据结构如下:

Typedef struct _OBJECT_DIRECTORY_ENTY
{
  Struct _OBJECT_DIRECTORY_ENTRY *NextEntry;
  POBJECT Object
}OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY,**PPOBJECT_DIRECTORY_ENTRY;
 
Typedef struct _OBJECT_DIRECTORY
{
  POBJECT_DIRECTORY_ENTRY HashTable[37];
  POBJECT_DIRECTORY_ENTRY CurrentEntry;
  BOOLEAN CurrentEntryValid;
  BYTE  Reserved1;
  WORD Reserved2;
  DWORD Reserved3;
}OBJECT_DIRECTORY, *POBJECT_DIRECTORY;

系统将对象名称进行一定的算法得出一个 HASH 值,算法如下:

//根据名字计算HASH值。

<span style="font-family: Arial, Helvetica, sans-serif;">hash = 0;</span>
p = (PSHORT)wStr; //存放名称的一个WCHAR数组
while(*p)
{
Symb = (CHAR)*p;
hash = hash * 3 + (hash >> 1);
 
if (Symb < 'a')  //<a
hash= hash  + Symb;
else if (Symb <= 'z')   //即 a~z
hash = hash + Symb - 0x20;
else          // > z
hash = hash + (CHAR)RtlUpcaseUnicodeChar((WCHAR)*p);
 
p ++;
}
hash = hash % 37;  //最终的hash值。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jhash函数是Linux内核一个用于哈希表操作的散列函数,它的实现代码可以在内核源码的"include/linux/jhash.h"头文件找到。 jhash函数的输入参数包括要哈希的数据、数据长度和一个初始化的哈希函数的返回是一个32位无符号整数,表示该数据在哈希表的位置。 jhash函数的实现使用了一些位运算和乘法运算,以及一些常量。具体实现可以参考下面的代码: ```c static inline u32 jhash(const void *key, u32 length, u32 initval) { u32 a, b, c; const u8 *k = (const u8 *)key; /* Set up the internal state */ a = b = c = 0xdeadbeef + length + initval; /* All but the last block: affect some 32 bits of (a,b,c) */ while (length > 12) { a += k[0]; a += ((u32)k[1])<<8; a += ((u32)k[2])<<16; a += ((u32)k[3])<<24; b += k[4]; b += ((u32)k[5])<<8; b += ((u32)k[6])<<16; b += ((u32)k[7])<<24; c += k[8]; c += ((u32)k[9])<<8; c += ((u32)k[10])<<16; c += ((u32)k[11])<<24; /* Mix */ a -= c; a ^= rol32(c, 4); c += b; b -= a; b ^= rol32(a, 6); a += c; c -= b; c ^= rol32(b, 8); b += a; a -= c; a ^= rol32(c, 16); c += b; b -= a; b ^= rol32(a, 19); a += c; c -= b; c ^= rol32(b, 4); b += a; k += 12; length -= 12; } /* Last block: affect all 32 bits of (c) */ switch (length) { case 12: c += ((u32)k[11])<<24; case 11: c += ((u32)k[10])<<16; case 10: c += ((u32)k[9])<<8; case 9: c += k[8]; case 8: b += ((u32)k[7])<<24; case 7: b += ((u32)k[6])<<16; case 6: b += ((u32)k[5])<<8; case 5: b += k[4]; case 4: a += ((u32)k[3])<<24; case 3: a += ((u32)k[2])<<16; case 2: a += ((u32)k[1])<<8; case 1: a += k[0]; }; /* Mix */ c ^= b; c -= rol32(b, 14); a ^= c; a -= rol32(c, 11); b ^= a; b -= rol32(a, 25); c ^= b; c -= rol32(b, 16); a ^= c; a -= rol32(c, 4); b ^= a; b -= rol32(a, 14); c ^= b; c -= rol32(b, 24); return c; } ``` 在上面的代码,rol32是一个左旋32位的宏,实现如下: ```c #define rol32(x, n) (((x)<<(n)) | ((x)>>(32-(n)))) ``` jhash函数采用了一种叫做"Bob Jenkins' Hash"的哈希算法,它被广泛应用于Linux内核的哈希表操作,具有较好的散列性能和分布特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值