将哈希值存储到int

时间:2016-05-09 17:23:11

标签: c++ openssl sha1

我实现了sha1哈希函数。哈希函数正确打印出哈希值,但没有正确地将哈希值存储到int变量中。请帮助我,我一直在努力,但我无法纠正错误。谢谢你的帮助。

这是功能

void hashSentence1(string Message1)

{   



    //sha1 hash is 20 bytes

    unsigned char hash[20];

    unsigned int ihexvalue;
    stringstream str;


   // compute the sha1 of the input, and store it our hash array

   SHA1((unsigned char*)Message1.c_str(), Message1.size(), hash);





   // convert the hash array to hexadecimal values and print out

  cout << "Hash of first message was: ";

  for(int i = 0; i < 20; ++i) 

  {

      cout << hex << (int)hash[i];
      str << hex << (int)hash[i];
      str >> ihexvalue; 

  }

  cout << endl << "ihexvalue " << ihexvalue;


  cout << endl << endl;



 }

这是输出,int变量应该与sha1

具有相同的值
  

要散列的消息edbfbeabc123

     

sha1 - &gt; df7dd80ba924cdef4421d4d73b26323793e24df

     

ihexvalue - &gt; DF

1 个答案:

答案 0 :(得分:1)

你的循环设置并重置每次循环迭代的ihexvalue的值。因此,在循环之后,ihexvalue只包含hash [19]的最终值。您可以从输出中看到这一点,该输出与哈希序列的末尾匹配。*

你需要仔细考虑你想要解决的问题。您可以使用移位和ORing将更多数字打包到整数中。但是,一个整数不足以容纳散列中的所有信息。

*如注释中所述,您的测试示例在哈希的开头和结尾都具有相同的值。仔细观察,所有循环迭代都使用相同的stringstream str。在这种情况下,如果你发现ihexvalue继续从str读取相同的值,那么因为str正在累积写入它的内容,而ihexvalue仍然只是每次从str读取第一个值。您会看到这在调试检查中始终具有相同的值。

根本问题无论哪种方式都是一样的。每次循环迭代都是设置或重置ihexvalue的值。

如果您为每个循环迭代使用了新的(或重置)字符串流,那么每次都会读取不同的值。但是,仅凭这一点并不能解决每次都重置ihexvalue值的基本问题。

如果你改为类似整数(或短整数或无符号字符)向量,你可以使用.push_back(ihexvalue)在每次循环迭代时将新值添加到结尾,它可以增长到只要需要的。

那就是说,我还建议你考虑一下为什么你要经历将它转换为文本以写入字符串流,然后从字符串流中读取文本以将其转换回数字表示的方式。既然你已经开始使用unsigned char数组中的数值,那么你是否真的通过进入和退出字符串流的昂贵过程获得了任何东西?我不知道上下文,但你可能会发现这只是一个漫长的过程,只能回到你开始时的整数值。