aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/hash.hh
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2005-01-14 16:04:03 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2005-01-14 16:04:03 +0000
commitd58a11e019813902b6c4547ca61a127938b2cc20 (patch)
treeddaff27d1a3c0604ffac989867cf63fbf8ce94ff /src/libutil/hash.hh
parent9530cc31700f68fd229eee69eabd2baa099f404a (diff)
* Shorten SHA-256 hashes used in store path name generation to 160
bits, then encode them in a radix-32 representation (using digits and letters except e, o, u, and t). This produces store paths like /nix/store/4i0zb0z7f88mwghjirkz702a71dcfivn-aterm-2.3.1. The nice thing about this is that the hash part of the file name is still 32 characters, as before with MD5. (Of course, shortening SHA-256 to 160 bits makes it no better than SHA-160 in theory, but hopefully it's a bit more resistant to attacks; it's certainly a lot slower.)
Diffstat (limited to 'src/libutil/hash.hh')
-rw-r--r--src/libutil/hash.hh24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/libutil/hash.hh b/src/libutil/hash.hh
index 4490d2ff7..0c9d7b9cb 100644
--- a/src/libutil/hash.hh
+++ b/src/libutil/hash.hh
@@ -8,7 +8,7 @@
using namespace std;
-typedef enum { htMD5, htSHA1, htSHA256 } HashType;
+typedef enum { htUnknown, htMD5, htSHA1, htSHA256 } HashType;
const int md5HashSize = 16;
@@ -24,7 +24,10 @@ struct Hash
HashType type;
- /* Create a zeroed hash object. */
+ /* Create an unusable hash object. */
+ Hash();
+
+ /* Create a zero-filled hash object. */
Hash(HashType type);
/* Check whether two hash are equal. */
@@ -36,13 +39,20 @@ struct Hash
/* For sorting. */
bool operator < (const Hash & h) const;
- /* Convert a hash code into a hexadecimal representation. */
- operator string() const;
};
+/* Convert a hash to a hexadecimal representation. */
+string printHash(const Hash & hash);
+
/* Parse a hexadecimal representation of a hash code. */
-Hash parseHash(const string & s);
+Hash parseHash(HashType ht, const string & s);
+
+/* Convert a hash to a base-32 representation. */
+string printHash32(const Hash & hash);
+
+/* Parse a base-32 representation of a hash code. */
+Hash parseHash32(HashType ht, const string & s);
/* Verify that the given string is a valid hash code. */
bool isHash(const string & s);
@@ -57,5 +67,9 @@ Hash hashFile(const Path & path, HashType ht);
md5(dump(path)). */
Hash hashPath(const Path & path, HashType ht);
+/* Compress a hash to the specified number of bytes by cyclically
+ XORing bytes together. */
+Hash compressHash(const Hash & hash, unsigned int newSize);
+
#endif /* !__HASH_H */