2016-05-09 21 views
0

私はsha1ハッシュ関数を実装しています。ハッシュ関数はハッシュ値を正しく出力していますが、ハッシュ値をint変数に正しく格納していません。私を助けてください、私は一日中試していますが、間違いを訂正することはできません。お手伝いありがとう。 > df7dd80ba924cdef4421d4d73b26323793e24df - ハッシュ値を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型の変数がedbfbeabc123

SHA1ハッシュことが

メッセージSHA1と同じ値を有するべきです

ihexvalue - > df

+0

コードステートメントをステートメントでデバッグしましたか? –

+2

私は 'unsigned int'がSHAハッシュを – ForceBru

+0

に変換できる巨大な番号を保持するのに十分な大きさであるかどうかはわかりません**あなたがsha1関数を作成したことは確かです。 – SergeyA

答えて

1

ループはループの繰り返しごとにihexvalueの値を設定およびリセットします。したがって、ループの後、ihexvalueにはhash [19]の最終値のみが含まれます。ハッシュシーケンスの終わりに一致する出力からこれを見ることができます。*

これを修正するには、意図したことを慎重に考える必要があります。シフティングとORingを使って、より多くの桁を整数にパックすることができます。しかし、1つの整数は、ハッシュにあるすべての情報を保持するのに十分な大きさではありません。

*コメントに記載されているように、テスト例はハッシュの先頭と末尾の両方で同じ値を持ちました。より詳しく見ると、すべてのループ反復は同じstringstream strを使用しています。このような状況の下で、ihexvalueがstrから同じ値を読み続けることがわかった場合、strは何が書き込まれているのか、ihexvalueはstrの最初の値を毎回読み込んでいるためです。これは、デバッグ検査で常に同じ値を得ていることがわかります。

基本的な問題はいずれの場合も同じです。すべてのループ反復は、ihexvalueの値を設定またはリセットしています。

ループの繰り返しごとに新しい(またはリセットされた)ストリングストリームを使用した場合、毎回異なる値を読み取ることになります。しかし、それだけでは、毎回ihexvalueの値がリセットされるという根本的な問題は解決されません。

整数(または短い整数または符号なしのchar)ベクトルのように変更した場合は、.push_back(ihexvalue)を使用してループの繰り返しごとに新しい値を最後に追加することができます必要に応じて。また、文字列に変換して文字列ストリームから文字列を読み込んで数値表現に変換する方法について、ラウンドを行っている理由を考えてみることをお勧めします。あなたが既に始まっているunsigned char配列に数値を持っているので、stringstreamに出入りする高価なプロセスを経て実際に何かを得ていますか?私は文脈を知らないが、あなたはそれが始まった整数値に戻るために山の周りに長い道のりであることが分かるかもしれない。

+0

こんにちは、おかげでありがとう、私のプログラムは、ハッシュの最終的な値を表示していません。代わりに最初の2つが表示されます。私はintにintを変更しましたが、まだ動作していません。 – Bhappy

+0

最初と最後の16進数の対が同じでない例を含めることをお勧めします。私は、ihexvalueに設定された最後の値が保持している値であることを期待しています。あなたのリビジョンでは、int値の配列(またはより良いベクトル)を使用できるように、各反復の値を新しい位置に読み込んでいることを確認してください。または、ベクトルを使用する場合は、整数を整数ベクトルの最後にpush_backすることができます。 – Eric

+0

ハッシュの始めと終わりが異なるテストケースを使用する以外に、何が起こっているのかを見るには、各ループの最後にihexvalueの値を(一時的に)書き出すか、デバッグモードでの各ループ反復でのihexvalueの値。 – Eric

関連する問題