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 つの個別のアルゴリズムを記述することもできます。