有一个glibc哈希函数?

我正在寻找一个自定义的哈希表实现C.是否有一个MD5 / SHA1哈希函数已经在GNU库或我必须使用外部库?

这里有点什么,我正在寻找:

int hashValue; hashValue = MD5_HASH(valToHash); 

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

或者把他的lookup3例程(放入公有领域)放到你的项目中:

对于散列表,您不需要加密强度,只需要很好的随机性。 破碎的密码散列函数(比如MD5)对此没有问题,但是您可能想要使用MD4 ,它更快更简单,直到您可以直接在代码中包含实现。 从规范中重写它并不难(因为只需要一个哈希表的函数,如果在某个时候出错了,它不是一个真正的问题)。 无耻的插件:在sphlib中有一个优化的C的MD4 实现 。

除非您已经有了使用MD5的充分理由,否则您可能需要重新考虑。 在散列表中为什么会产生一个“好”的散列函数呢,相当依赖于你想要完成的工作。 您可能想要阅读Python的dictobject.c中的dictobject.c来查看其他人做出的折衷。

有几个值得信赖的,简单的版本可用 – 我有一些R的摘要来源。 这是我在DESCRIPTION文件中写的:

说明:摘要包提供了使用md5,sha-1,sha-256和crc32算法创建任意R对象的“散列”摘要的功能,允许轻松比较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. */ 

和他的代码匹配的参考输出。

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

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

gcrypt和openssl可以做MD5,SHA和其他散列这里有一个libgcrypt的例子:

 #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); } 

`

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);