我在犹豫如何组织在C ++中实现SHA2算法。

我的犹豫来自于这样一个事实,即SHA2可以以4种方式实现,它将产生4种不同的摘要大小(224、256、384和512位)。

我在考虑专门用于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种独立的算法,而不必修改代码风格。

最佳答案

如果使用模板参数,则该值必须在编译时可用。如果没有可能的实现,等到运行时标记错误似乎很愚蠢。

因此,请保留未指定的未专门化的模板,并使其产生编译时错误。

关于c++ - C++代码风格:SHA2算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15191859/

10-10 20:11