Files
2024-04-27 17:15:17 +08:00

46 lines
1.7 KiB
C

#pragma once
typedef struct _HASH_BUCKET {
SINGLE_LIST_ENTRY BucketLink;
UINT64 Key;
}HASH_BUCKET, * PHASH_BUCKET;
typedef struct _HASH_TABLE {
UINT32 EntryCount;
UINT32 MaskBitCount : 5;
UINT32 BucketCount : 27;
PSINGLE_LIST_ENTRY Buckets;
}HASH_TABLE, * PHASH_TABLE;
typedef struct _HASH_TABLE_ITERATOR {
PHASH_TABLE Hash;
PSINGLE_LIST_ENTRY HashEntry;
PSINGLE_LIST_ENTRY Bucket;
}HASH_TABLE_ITERATOR, * PHASH_TABLE_ITERATOR;
UINT64 HashBytesGeneric(PUCHAR pBytes, size_t size,
UINT64 kMagicNum, UINT64 coefficient);
UINT64 HashBytesEx(PUCHAR pBytes, size_t size, UINT64 kMagicNum);
UINT64 HashBytes(PUCHAR pBytes, size_t size);
UINT64 HashUlongPtr(UINT64 value);
UINT64 HashUStringUpcase(PWCH pBuffer, int len);
UINT32 GetHighestBitIndex(UINT32 value);
UINT32 RoundToPowerOfTwo(UINT32 value, BOOLEAN roundUpToNext);
BOOLEAN IsPowerOfTwo(UINT32 x);
void HashTableInitialize(PHASH_TABLE Hash, UINT32 MaskBitCount,
UINT32 BucketCount, PSINGLE_LIST_ENTRY Buckets);
UINT32 HashTableGetBucketIndex(UINT32 BucketCount, UINT64 Key);
UINT32 HashTableInsert(PHASH_TABLE Hash, PHASH_BUCKET pBucket);
BOOLEAN HashBucketLastLink(PSINGLE_LIST_ENTRY bucket);
PSINGLE_LIST_ENTRY HashTableChangeTable(PHASH_TABLE Hash, ULONG allocCount, PSINGLE_LIST_ENTRY pBuckets);
PSINGLE_LIST_ENTRY HashTableFindNext(PHASH_TABLE Hash, UINT64 HashValue, PSINGLE_LIST_ENTRY pLink);
PHASH_TABLE HashTableGetTable(PSINGLE_LIST_ENTRY HashEntry);
PSINGLE_LIST_ENTRY HashTableCleanup(PHASH_TABLE Hash);
PSINGLE_LIST_ENTRY HashTableRemoveKey(PHASH_TABLE Hash, UINT64 HashValue);
void HashTableIterInit(PHASH_TABLE_ITERATOR Iterator, PHASH_TABLE Hash);
PSINGLE_LIST_ENTRY HashTableIterGetNext(PHASH_TABLE_ITERATOR Iterator);
PSINGLE_LIST_ENTRY HashTableIterRemove(PHASH_TABLE_ITERATOR Iterator);