我试图在系统函数上创建一个钩子open().我按照以下几点做了这个.
我创建了一个包装库,其中包含以下内容:
extern int mocked_open(const char* fn, int flags, va_list args);
int open(const char* fn, int flags, ...)
{
int r = -1;
va_list args;
va_start(args, flags);
r = mocked_open(fn, flags, args);
va_end(args);
return r;
}
Run Code Online (Sandbox Code Playgroud)
我将其编译为libwrapper.so,我使用LD_PRELOAD加载.
执行mocked_open()如下(我使用CPPUtest框架):
int mocked_open(const char* fn, int flags, va_list args)
{
if (strncmp(fn, test_device_id, 11) == 0)
{
return mock().actualCall("open").returnValue().getIntValue();
}
else
{
int r = -1;
int (*my_open)(const char*, int, ...);
void* fptr = dlsym(RTLD_NEXT, "open");
memcpy(&my_open, &fptr, sizeof(my_open)); …Run Code Online (Sandbox Code Playgroud) 我想实现一个hashmap,但不允许扩展。因为我知道我最多需要存储N元素,所以我可以N为哈希表的每个存储桶预先分配一个包含元素的数组,这样我仍然可以N在最坏的情况下存储元素,即所有键都在同一个存储桶上散列。但是我需要存储的元素相当大,所以对于大的来说,N这是非常低效的内存使用。
是否可以使用固定数量的内存(例如通过实现智能散列函数)有效地(就内存而言)实现散列图?
(PS:键是一个无符号的 32 位整数,我对键没有先验知识,只是我将收到的键值在范围的一个相当小的子集中,并且这个子集在范围内移动得非常缓慢.)
我现在有一个实现,其中我有两个 length 数组N,一个包含元素,另一个包含对应i于两个数组中位置元素的键。我使用模运算作为散列函数来确定元素应该插入/存在的位置,并使用线性探针在发生碰撞时找到最近的空点。我认为这是 O(N) 的复杂性,我认为这对于我期望的数据量来说会相当快。我问了这个问题,看看是否可以做得更好。