forked from lix-project/lix
Simplify parseHash32
This commit is contained in:
parent
db2ec59903
commit
0d1dafa0c4
|
@ -141,51 +141,24 @@ string printHash16or32(const Hash & hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool mul(unsigned char * bytes, unsigned char y, int maxSize)
|
|
||||||
{
|
|
||||||
unsigned char carry = 0;
|
|
||||||
|
|
||||||
for (int pos = 0; pos < maxSize; ++pos) {
|
|
||||||
unsigned int m = bytes[pos] * y + carry;
|
|
||||||
bytes[pos] = m & 0xff;
|
|
||||||
carry = m >> 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
return carry;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool add(unsigned char * bytes, unsigned char y, int maxSize)
|
|
||||||
{
|
|
||||||
unsigned char carry = y;
|
|
||||||
|
|
||||||
for (int pos = 0; pos < maxSize; ++pos) {
|
|
||||||
unsigned int m = bytes[pos] + carry;
|
|
||||||
bytes[pos] = m & 0xff;
|
|
||||||
carry = m >> 8;
|
|
||||||
if (carry == 0) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return carry;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Hash parseHash32(HashType ht, const string & s)
|
Hash parseHash32(HashType ht, const string & s)
|
||||||
{
|
{
|
||||||
Hash hash(ht);
|
Hash hash(ht);
|
||||||
|
unsigned int len = hashLength32(ht);
|
||||||
|
assert(s.size() == len);
|
||||||
|
|
||||||
const char * chars = base32Chars.data();
|
for (unsigned int n = 0; n < len; ++n) {
|
||||||
|
char c = s[len - n - 1];
|
||||||
for (unsigned int i = 0; i < s.length(); ++i) {
|
|
||||||
char c = s[i];
|
|
||||||
unsigned char digit;
|
unsigned char digit;
|
||||||
for (digit = 0; digit < base32Chars.size(); ++digit) /* !!! slow */
|
for (digit = 0; digit < base32Chars.size(); ++digit) /* !!! slow */
|
||||||
if (chars[digit] == c) break;
|
if (base32Chars[digit] == c) break;
|
||||||
if (digit >= 32)
|
if (digit >= 32)
|
||||||
throw Error(format("invalid base-32 hash ‘%1%’") % s);
|
throw Error(format("invalid base-32 hash ‘%1%’") % s);
|
||||||
if (mul(hash.hash, 32, hash.hashSize) ||
|
unsigned int b = n * 5;
|
||||||
add(hash.hash, digit, hash.hashSize))
|
unsigned int i = b / 8;
|
||||||
throw Error(format("base-32 hash ‘%1%’ is too large") % s);
|
unsigned int j = b % 8;
|
||||||
|
hash.hash[i] |= digit << j;
|
||||||
|
if (i < hash.hashSize - 1) hash.hash[i + 1] |= digit >> (8 - j);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
|
|
Loading…
Reference in a new issue