aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/hash.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-02-03 18:56:47 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-02-03 18:56:47 +0100
commit0d1dafa0c4ef8adc27315653df8a170c0cf33985 (patch)
tree96c9976c6c49f25f1b3d4e38008cc656e8eb61cb /src/libutil/hash.cc
parentdb2ec599039ebe794eb56770a546c7b2ef87fc50 (diff)
Simplify parseHash32
Diffstat (limited to 'src/libutil/hash.cc')
-rw-r--r--src/libutil/hash.cc47
1 files changed, 10 insertions, 37 deletions
diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc
index 00804c2a1..a83ba0a81 100644
--- a/src/libutil/hash.cc
+++ b/src/libutil/hash.cc
@@ -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 hash(ht);
+ unsigned int len = hashLength32(ht);
+ assert(s.size() == len);
- const char * chars = base32Chars.data();
-
- for (unsigned int i = 0; i < s.length(); ++i) {
- char c = s[i];
+ for (unsigned int n = 0; n < len; ++n) {
+ char c = s[len - n - 1];
unsigned char digit;
for (digit = 0; digit < base32Chars.size(); ++digit) /* !!! slow */
- if (chars[digit] == c) break;
+ if (base32Chars[digit] == c) break;
if (digit >= 32)
throw Error(format("invalid base-32 hash ‘%1%’") % s);
- if (mul(hash.hash, 32, hash.hashSize) ||
- add(hash.hash, digit, hash.hashSize))
- throw Error(format("base-32 hash ‘%1%’ is too large") % s);
+ unsigned int b = n * 5;
+ unsigned int i = b / 8;
+ unsigned int j = b % 8;
+ hash.hash[i] |= digit << j;
+ if (i < hash.hashSize - 1) hash.hash[i + 1] |= digit >> (8 - j);
}
return hash;