首页 > 代码库 > 使用哈希算法将数字解析为函数指针-一种架构方法

使用哈希算法将数字解析为函数指针-一种架构方法

使用哈希算法将数字解析为函数指针:

这也算是最简单的,不会带有地址冲突的哈希了,哈希函数可以描述为:

func = arr[index].func

index为输入,根据输入的index,找到其对应的函数指针返回

这种架构虽然简单,但是在做测试时还是非常有用的

比如一种测试有几十项,我可以使用这种架构来实现自动轮巡测试,或者手动交互时输入一个Index,即可以去调用对应的测试函数

另外根据这个代码,还可以学习到函数指针的定义和使用:

定义:typedef int (*FuncPtr)(char *str);

使用:

FuncPtr MainPtr;
char *str = "test string!";


MainPtr = hashFunc(1);
MainPtr(str);

源码如下:

root@ubuntu:/mnt/shared/appbox/hashfun# cat hashfun.c 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

typedef struct 
{
        int index;
        int (*func) (char *str);
}HashSt;

typedef int (*FuncPtr)(char *str);

int func0(char *str);
int func1(char *str);


HashSt HashStArr[] = {
        {0, func0},
        {1, func1},
};

int func0(char *str)
{
        printf("func1, str:%s!\n", str);
        return 0;
}

int func1(char *str)
{
        printf("func2, str:%s!\n", str);
        return 0;
}

/*
* hash function: func(index) = HashStArr[index].func
*/
FuncPtr hashFunc(int index)
{
        return HashStArr[index].func;
}


int main(int argc, char *argv[])
{
        FuncPtr MainPtr;
        char *str = "test string!";

        MainPtr = hashFunc(1);
        MainPtr(str);

        MainPtr = hashFunc(1);
        MainPtr(str);


        return 0;
}

root@ubuntu:/mnt/shared/appbox/hashfun# 
输出如下:

root@ubuntu:/mnt/shared/appbox/hashfun# ./hashfun     
func2, str:test string!!
func2, str:test string!!


main函数可以优化为:

int main(int argc, char *argv[])
{
        FuncPtr MainPtr;
        char *str = "test string!";
        int i;

        for(i=0; i<2; i++)
        {
                MainPtr = hashFunc(i);
                MainPtr(str);
        }

        return 0;
}

输入同样为:

root@ubuntu:/mnt/shared/appbox/hashfun# ./hashfun                
func1, str:test string!!
func2, str:test string!!


使用哈希算法将数字解析为函数指针-一种架构方法