0

C++ での SHA2 アルゴリズムの実装を整理する方法をためらっています。

私のためらいは、SHA2 が 4 つの異なるダイジェスト サイズ (224、256、384、および 512 ビット) を生成する 4 つの方法で実装できるという事実から来ています。

SHA2で作成できるダイジェストサイズに特化したテンプレートクラスを考えていました。問題は、非専門クラスに何を書くかです。いくつかの可能性を考えることができます:

//1 : throw exception on instantiation.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    SHA2(){
        throw SHA2NotImplementedException(bits);
    }
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const = 0;
}

//2 : throw exception on use.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const{return SHA2NotImplementedException(bits);}
}

//3 : forbid instantiation and inheritance.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

private:
    SHA2(){}

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const = 0;
}

//4 : forbid instantiation.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const = 0;
}


//5 : dummy return.
template<size_t bits> class SHA2 : public HashAlgorithm<Bits,Bits>{

public:
    virtual ~SHA2() throw(){}
    virtual Bits hash(const Bits& data)const{return Bits();}
}


//Write template specialization for bits = 224, 256, 384 and 512

それで、あなたは何を書きますか?他の選択肢よりも明確なのはどの選択肢で、その理由は何ですか?

PS : コード スタイルを変更せずに、4 つの個別のアルゴリズムを記述することもできます

4

2 に答える 2

2

テンプレート引数を使用する場合、その値はコンパイル時に利用可能でなければなりません。可能な実装がない場合、ランタイムまでエラーにフラグを立てるのを待つのはばかげているようです。

したがって、特殊化されていないテンプレートを未指定のままにし、コンパイル時にエラーが発生するようにします。

于 2013-03-03T22:50:39.357 に答える
1

完全に空のままにしてください (メンバー関数や変数が宣言されていません)...なぜですか? これは、特殊化されていないクラスが使用されない場合の標準的な手法です。

テンプレートのインスタンス化は同じインターフェースを持つ必要はありません: 基本的に完全に別のクラスです。

于 2013-03-03T22:49:34.217 に答える