arcfour: small speedup
This commit is contained in:
parent
52a7ce08cf
commit
d4ba7793f2
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue