【发布时间】:2015-04-23 16:27:40
【问题描述】:
我想要做什么
OpenSSL 的MD5 function from the crypto library(以及许多其他哈希函数)返回一个unsigned char 数组。 我正在尝试从这个数组中获取一个哈希字符串。
例子:
数组:
{126, 113, 177, 57, 8, 169, 240, 118, 60, 10, 229, 74, 249, 6, 32, 128}哈希:
7e71b13908a9f0763c0ae54af9062080
数组中的每个数字都表示为两个十六进制数字。并且哈希字符串的长度是数组长度的两倍。
我有什么
请查看完整代码here。这是其中的一部分。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nu 0
typedef struct {
int len;
unsigned char *Hash;
}Type;
Type test[6];
int main(void) {
unsigned char XUzQ[16]={
126, 113, 177, 57, 8, 169, 240, 118, 60, 10, 229, 74, 249, 6, 32, 128
};
test[0].len=16; test[0].Hash=XUzQ;
int h;
const char *hex="0123456789abcdef";
char *Ha=calloc(test[nu].len*2+1,sizeof(char));
for (h=0;h<test[nu].len;++h) {
*(++Ha)=hex[(test[nu].Hash[h]/16)%16];
*(++Ha)=hex[test[nu].Hash[h]%16];
}
Ha-=(test[nu].len*2-1);
if (strlen(Ha)==(test[nu].len*2))
printf("'%s'\n",Ha);
else puts("Failed!");
Ha--;
free(Ha);
return 0;
}
这会打印出我期望的值 (7e71b13908a9f0763c0ae54af9062080),但在我看来,同样的事情可以更好更快地实现。
注意事项
我正在使用的数组的名称非常奇怪,因为它们是由我的 Python 脚本使用随机字符自动生成的。
test 旨在成为一个那么大的数组(请点击上面的链接查看我的完整代码)。
问题
我怎样才能更快、更轻松地获得相同的结果?如果该解决方案支持 OpenSSL 支持的所有哈希算法,我将不胜感激。
【问题讨论】:
-
hash function for string 的可能副本
-
加密哈希函数和哈希表哈希函数是非常不同的生物。第一个是在设计时考虑到开裂。第二个是寻找均匀分布的输出,并且 FAST!!
-
@Degustaf,请仔细阅读我的问题,我不是在开发哈希表,我很确定
crypto库是我想要使用的库。 -
1) 'Ha' 是指向通过调用 calloc 设置的 char 的指针。永远不应修改该指针。建议使用以“Ha”副本开头的第二个指针。 2) 当完成分配的内存段时,将指向该分配内存的指针传递给 free(),否则将导致内存泄漏。 3) 始终检查 calloc() 和函数族的返回值(!= NULL),以确保操作成功。
-
strlen() 函数返回一个无符号的“size_t”。正在与 Type 结构中的“int len”字段进行比较。这会导致编译器发出警告,从而导致编译不“干净”。建议将 'int len' 更改为 'unsigned len' 并更改 'int h;'到'无符号h;;这将导致一个干净的编译。