是否有glibc哈希函数?

时间:2010-10-14 18:01:19

标签: c linux hash md5 gnu

我想在C中做一个自定义哈希表实现。在GNU库中是否已经有一个MD5 / SHA1哈希函数,或者我是否必须使用外部库?

这就是我正在寻找的东西:

int hashValue;

hashValue = MD5_HASH(valToHash);

8 个答案:

答案 0 :(得分:5)

对于哈希表,您不需要加密强度,只需要良好的随机化属性。破解加密哈希函数(如MD5)就可以了,但您可能希望使用MD4,它既快又简单,只需在代码中直接包含一个实现即可。从规范中重写它并不困难(因为你只想要一个哈希表的函数,如果你在某些时候弄错了它就不是真正的问题)。无耻插件:在sphlib中有一个优化的MD4 C实现。

答案 1 :(得分:5)

您可以查看Bob Jenkin对许多哈希函数的调查和分析:

或者只是将他的lookup3例程(他将其放入公共领域)放入您的项目中:

答案 2 :(得分:3)

有一些可信的,简单的版本可供使用 - 我在digest R的来源中有一些。 以下是我在DESCRIPTION文件中写的内容:

  

描述:摘要包   提供创建功能   任意R的“哈希”摘要   使用md5,sha-1,sha-256的对象   和crc32算法允许简单   R语言对象的比较。该   Ron Rivest的md5算法是   在RFC 1321中指定,SHA-1和   SHA-256算法在。中指定   FIPS-180-1和FIPS-180-2,以及   crc32算法在中描述   ftp://ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt。   对于md5,sha-1和sha-256,这个   包使用小型独立   由...提供的实现   Christophe Devine。对于crc32,代码   来自zlib库使用。

我认为Christophe的一些代码不再是cr0.net,但是搜索应该引导你进入其他几个包含它的项目。他的文件标题很清楚:

/*                                                   
 * FIPS-180-1 compliant SHA-1 implementation,   
 * by Christophe Devine <devine@cr0.net>;   
 * this program is licensed under the GPL.  
 */     

并且他的代码与参考输出匹配。

答案 3 :(得分:3)

除非您已经有充分的理由使用MD5,否则您可能需要重新考虑。在哈希表中使用“好”哈希函数的原因很大程度上取决于您要完成的任务。您可能希望阅读Python dictobject.c中的注释,以了解其他人所做的权衡。

答案 4 :(得分:3)

如果盐以$ 1 $开头,Glibc crypt()使用基于MD5的算法。但既然你提到你要做一个哈希表实现,也许詹金斯哈希会更合适。

答案 5 :(得分:2)

OpenSSL库包含您可能想要的所有加密例程,包括加密哈希。

答案 6 :(得分:2)

gcrypt和openssl可以在这里使用libgcrypt做MD5,SHA和其他哈希:

#include <gcrypt.h>
#include <stdio.h>

//  compile  gcc  md5_test.c  -lgcrypt

int main(int argc, char *argv[])
{
        unsigned char digest[16];
        char digest_ascii[32+1] = {0,};
        int digest_length = gcry_md_get_algo_dlen (GCRY_MD_MD5);
        int i;
        printf("hashing=%s len=%d\n", argv[1], digest_length);
        gcry_md_hash_buffer(GCRY_MD_MD5, digest, argv[1], strlen(argv[1]));

        for (i=0; i < digest_length; i++) {
                sprintf(digest_ascii+(i*2), "%02x", digest[i]);
        }
        printf("hash=%s\n", digest_ascii);
}

`

答案 7 :(得分:0)

Murmur3是一种可以使用的快速非加密算法。

在这个帖子中可以找到杂音与其他算法的快速比较https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

一种可能的实施方式:https://github.com/PeterScott/murmur3

示例:

uint32_t hash;
uint32_t seed = 42;
char* input = "HelloWorld";

MurmurHash3_x86_32(input, strlen(input), seed, &hash);
printf("x86_32:  %08x\n", hash);