C Progma说散列是不同的,但它不是
我有一个程序,从一个文件生成一个散列键,并显示该散列。我正在尝试检查结果哈希键是否与预期的哈希键对应。但这不起作用,因为当散列键与预期值相同时,我会收到消息说“散列不同”。你看到什么不正确了吗 与问题相关的一些变量C Progma说散列是不同的,但它不是,c,C,我有一个程序,从一个文件生成一个散列键,并显示该散列。我正在尝试检查结果哈希键是否与预期的哈希键对应。但这不起作用,因为当散列键与预期值相同时,我会收到消息说“散列不同”。你看到什么不正确了吗 与问题相关的一些变量 BYTE rgbFile[BUFSIZE]; DWORD cbRead = 0; BYTE rgbHash[MD5LEN]; DWORD cbHash = 0; CHAR rgbDigits[] = "0123456789abcdef";
BYTE rgbFile[BUFSIZE];
DWORD cbRead = 0;
BYTE rgbHash[MD5LEN];
DWORD cbHash = 0;
CHAR rgbDigits[] = "0123456789abcdef";
PCSTR filename = "c:\\Users\\jax\\Desktop\\files\\test.txt";
CHAR hashExpected[] = "4ab5d20e55ef73e4f412d73c2a201e";
在下面的代码中,它显示了一条类似“文件哈希为”4ab5d20e55ef73e4f412d73c2a201e”的消息,我在其中进行了比较:
DWORD i;
CHAR hashResult= "";
printf("Hash of file %s is: ", filename);
for (i = 0; i < cbHash; i++)
{
printf("%c%c",
rgbDigits[rgbHash[i] >> 4],
rgbDigits[rgbHash[i] & 0xf]);
hashResult = rgbDigits[rgbHash[i] >> 4];
hashResult += rgbDigits[rgbHash[i] & 0xf];
}
printf("\n");
printf(hashResult);
if(hashResult == hashExpected){
printf("hash is the same");
}
else{
printf("hash is different");
}
您在类型方面存在一些重大问题,至少在比较中是这样
if(hashResult == hashExpected){
hashResult
是一个CHAR
和hashExpected
(没有数组索引)是内存中CHAR
数组开始的地址。您需要比较存储在该数组中的实际值,而不仅仅是它所在位置的地址
编辑:我注意到
hashResult
是一个CHAR
,而不是之前编写的数组。无论哪种方式,hashResult==hashExpected
比较都是不合适的。您显示的代码不应该在没有警告的情况下编译。您既有CHAR a[]=“…”;
又有CHAR b=”";代码>。您无法将字符串与==
进行相等比较,但确实可以。请考虑如何比较两个数组:元素对元素。只有当所有对应元素相等时,两个数组的值才相等。您不能只进行一次比较,然后立即知道“哈希是相同的”
,您必须等待,直到您知道所有哈希都是相同的。如果您发现一个元素不匹配,那么您会立即知道它们不相等。再次感谢您的回答。据我所知,在您的帮助下,我现在更新的代码应该可以工作,因为如果它发现两个字母不同,则返回false,如果都是icual,则返回true。但是我总是收到“散列不同”的信息,它们是相互关联的。谢谢你的回答。据我所知,问题在于hashResult存储时没有数组索引。现在我这样做了,但是结果是一样的,消息说“Hash是different”。您仍然在if语句中比较地址,而您必须比较数组中的值,如if(hashResult[i]==hashExpected[i]){
遍历数组时。如果字符数组是\0
终止,则使用字符串比较函数感谢您的帮助。我认为现在应该可以了,因为我遍历数组并检查每个元素是否相互关联。但它总是显示“哈希相同”即使我把散列改成另一个。
BOOL test( char array1[] , char array2[] )
{
int i;
for( i = 0; array1[i] && array2[i]; ++i )
{
if( array1[i] != array2[i] )
{
return( FALSE );
}
}
return( TRUE );
}
if(hashResult == hashExpected){