我期待在C中执行自定义哈希表实现。在GNU库中是否存在MD5/SHA1哈希函数,还是必须为此使用外部库?是否有glibc散列函数?
这里是有点什么我在寻找:
int hashValue;
hashValue = MD5_HASH(valToHash);
我期待在C中执行自定义哈希表实现。在GNU库中是否存在MD5/SHA1哈希函数,还是必须为此使用外部库?是否有glibc散列函数?
这里是有点什么我在寻找:
int hashValue;
hashValue = MD5_HASH(valToHash);
你可以看看鲍勃·詹金的调查和分析的许多散列函数:
或者刚落,他的lookup3例程(其中他投入公共领域)到您的项目:
有几个值得信赖的,简单的可用版本 - 我在digest来源数为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 <[email protected]>;
* this program is licensed under the GPL.
*/
和他的代码匹配参考输出。
除非您已经有了使用MD5的充分理由,否则您可能需要重新考虑。什么使散列表中的“好”散列函数非常依赖于你想要完成的工作。您可能想阅读Python的dictobject.c
中的评论,看看其他人做出的折衷。
Glibc的crypt()
使用基于MD5的算法,如果盐以$ 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);
即使有,你必须也传递一个长度参数。 – Blindy 2010-10-14 18:02:47