美文网首页
libmhash计算md5值

libmhash计算md5值

作者: 一路向后 | 来源:发表于2022-03-08 22:01 被阅读0次

    1.源码实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <mhash.h>
    
    void reverse_bytes(unsigned char *start, unsigned long len)
    {
        unsigned char *lo = start;
        unsigned char *hi = start + len - 1;
        unsigned char swap;
    
        while(lo<hi)
        {
            swap = *lo;
            *lo++ = *hi;
            *hi-- = swap;
        }
    }
    
    char *convert_to_hex(unsigned char *hash_data, unsigned long len)
    {
        char *converted;
        unsigned long i;
    
        converted = (char *)malloc((len*2)+1);
        memset(converted, 0, (len*2)+1);
    
        for(i=0;i<len;i++)
        {
            sprintf(converted+(i*2), "%02x", hash_data[i]);
        }
    
        return converted;
    }
    
    char *hash(hashid hashType, unsigned char *data, unsigned long len)
    {
        MHASH td;
        unsigned char *hash_data;
        char *converted=0;
        unsigned long block_size;
    
        if((td=mhash_init(hashType))==MHASH_FAILED)
            return 0;
    
        mhash(td, data, len);
    
        if((hash_data=(unsigned char *)mhash_end(td)))
        {
            block_size = mhash_get_block_size(hashType);
            if(hashType==MHASH_ADLER32)
                reverse_bytes(hash_data, block_size);
            converted = convert_to_hex(hash_data, block_size);
            mhash_free(hash_data);
        }
    
        return converted;
    }
    
    hashid get_hash_type_by_name(const char * name)
    {
        if(strcasecmp(name, "crc32") == 0)
        {
            return MHASH_CRC32;
        }
        else if(strcasecmp(name, "md5") == 0)
        {
            return MHASH_MD5;
        }
        else if(strcasecmp(name, "ripemd160") == 0)
        {
            return MHASH_RIPEMD160;
        }
    
        return (hashid)-1;
    }
    
    int main()
    {
        hashid type;
        char *hashed = 0;
        char data[128] = "hello world";
        char name[32] = "md5";
        int i;
    
        type = get_hash_type_by_name(name);
    
        if(type == -1)
        {
            return -1;
        }
    
        hashed = hash(type, (unsigned char *)data, strlen(data));
    
        if(!hashed)
        {
            return -1;
        }
    
        printf("%s\n", hashed);
    
        free(hashed);
    
        return 0;
    }
    

    2.编译源码

    $ gcc -o test test.c -std=c89 -lmhash -Wl,-rpath=/usr/local/lib
    

    3.运行及其结果

    $ ./test
    5eb63bbbe01eeed093cb22bb8f5acdc3
    

    相关文章

      网友评论

          本文标题:libmhash计算md5值

          本文链接:https://www.haomeiwen.com/subject/lurzrrtx.html