arcfour: small speedup

This commit is contained in:
Mirek Kratochvil 2012-12-25 21:32:15 +01:00
parent 52a7ce08cf
commit d4ba7793f2

View file

@ -27,29 +27,28 @@ template<class inttype> class arcfour
{ {
std::vector<inttype> S; std::vector<inttype> S;
inttype I, J; inttype I, J;
size_t mod; inttype mask;
public: public:
bool init (size_t bits) { bool init (unsigned bits) {
if (bits > 8 * sizeof (inttype) ) return false; if (bits > 8 * sizeof (inttype) ) return false;
I = J = 0; I = J = 0;
S.resize (1 << bits); S.resize (1 << bits);
mod = 1 << bits; mask = ~ (inttype) 0;
for (size_t i = 0; i < (1 << bits); ++i) { if ( (inttype) (1 << bits) ) mask %= 1 << bits;
S[i] = i; for (size_t i = 0; i < (1 << bits); ++i) S[i] = i;
}
return true; return true;
} }
void clear() { void clear() {
I = J = 0; I = J = 0;
mod = 0; mask = 0;
S.clear(); S.clear();
} }
void load_key (const std::vector<inttype>&K) { void load_key (const std::vector<inttype>&K) {
inttype j = 0, t; inttype j = 0, t;
for (size_t i = 0; i < mod; ++i) { for (size_t i = 0; i <= mask; ++i) {
j = (j + S[i] + K[i % K.size()]) % mod; j = (j + S[i] + K[i % K.size()]) & mask;
t = S[j]; t = S[j];
S[j] = S[i]; S[j] = S[i];
S[i] = t; S[i] = t;
@ -57,15 +56,15 @@ public:
} }
inttype gen() { inttype gen() {
I = (I + 1) % mod; I = (I + 1) & mask;
J = (J + S[I]) % mod; J = (J + S[I]) & mask;
register inttype t; register inttype t;
t = S[J]; t = S[J];
S[J] = S[I]; S[J] = S[I];
S[I] = t; S[I] = t;
return S[ (S[I] + S[J]) % mod]; return S[ (S[I] + S[J]) & mask];
} }
void discard (size_t n) { void discard (size_t n) {