Fixes #679. Note: on x86_64, SHA-512 is considerably faster than SHA-256 (198 MB/s versus 131 MB/s). Co-authored-by: Ludovic Courtès <ludo@gnu.org>
		
			
				
	
	
		
			114 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
#include "types.hh"
 | 
						|
#include "serialise.hh"
 | 
						|
 | 
						|
 | 
						|
namespace nix {
 | 
						|
 | 
						|
 | 
						|
typedef enum { htUnknown, htMD5, htSHA1, htSHA256, htSHA512 } HashType;
 | 
						|
 | 
						|
 | 
						|
const int md5HashSize = 16;
 | 
						|
const int sha1HashSize = 20;
 | 
						|
const int sha256HashSize = 32;
 | 
						|
const int sha512HashSize = 64;
 | 
						|
 | 
						|
extern const string base32Chars;
 | 
						|
 | 
						|
 | 
						|
struct Hash
 | 
						|
{
 | 
						|
    static const unsigned int maxHashSize = 64;
 | 
						|
    unsigned int hashSize;
 | 
						|
    unsigned char hash[maxHashSize];
 | 
						|
 | 
						|
    HashType type;
 | 
						|
 | 
						|
    /* Create an unusable hash object. */
 | 
						|
    Hash();
 | 
						|
 | 
						|
    /* Create a zero-filled hash object. */
 | 
						|
    Hash(HashType type);
 | 
						|
 | 
						|
    /* Check whether two hash are equal. */
 | 
						|
    bool operator == (const Hash & h2) const;
 | 
						|
 | 
						|
    /* Check whether two hash are not equal. */
 | 
						|
    bool operator != (const Hash & h2) const;
 | 
						|
 | 
						|
    /* For sorting. */
 | 
						|
    bool operator < (const Hash & h) const;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Convert a hash to a hexadecimal representation. */
 | 
						|
string printHash(const Hash & hash);
 | 
						|
 | 
						|
/* Parse a hexadecimal representation of a hash code. */
 | 
						|
Hash parseHash(HashType ht, const string & s);
 | 
						|
 | 
						|
/* Returns the length of a base-32 hash representation. */
 | 
						|
unsigned int hashLength32(const Hash & hash);
 | 
						|
 | 
						|
/* Convert a hash to a base-32 representation. */
 | 
						|
string printHash32(const Hash & hash);
 | 
						|
 | 
						|
/* Print a hash in base-16 if it's MD5, or base-32 otherwise. */
 | 
						|
string printHash16or32(const Hash & hash);
 | 
						|
 | 
						|
/* Parse a base-32 representation of a hash code. */
 | 
						|
Hash parseHash32(HashType ht, const string & s);
 | 
						|
 | 
						|
/* Parse a base-16 or base-32 representation of a hash code. */
 | 
						|
Hash parseHash16or32(HashType ht, const string & s);
 | 
						|
 | 
						|
/* Verify that the given string is a valid hash code. */
 | 
						|
bool isHash(const string & s);
 | 
						|
 | 
						|
/* Compute the hash of the given string. */
 | 
						|
Hash hashString(HashType ht, const string & s);
 | 
						|
 | 
						|
/* Compute the hash of the given file. */
 | 
						|
Hash hashFile(HashType ht, const Path & path);
 | 
						|
 | 
						|
/* Compute the hash of the given path.  The hash is defined as
 | 
						|
   (essentially) hashString(ht, dumpPath(path)). */
 | 
						|
struct PathFilter;
 | 
						|
extern PathFilter defaultPathFilter;
 | 
						|
typedef std::pair<Hash, unsigned long long> HashResult;
 | 
						|
HashResult hashPath(HashType ht, const Path & path,
 | 
						|
    PathFilter & filter = defaultPathFilter);
 | 
						|
 | 
						|
/* Compress a hash to the specified number of bytes by cyclically
 | 
						|
   XORing bytes together. */
 | 
						|
Hash compressHash(const Hash & hash, unsigned int newSize);
 | 
						|
 | 
						|
/* Parse a string representing a hash type. */
 | 
						|
HashType parseHashType(const string & s);
 | 
						|
 | 
						|
/* And the reverse. */
 | 
						|
string printHashType(HashType ht);
 | 
						|
 | 
						|
 | 
						|
struct Ctx;
 | 
						|
 | 
						|
class HashSink : public BufferedSink
 | 
						|
{
 | 
						|
private:
 | 
						|
    HashType ht;
 | 
						|
    Ctx * ctx;
 | 
						|
    unsigned long long bytes;
 | 
						|
 | 
						|
public:
 | 
						|
    HashSink(HashType ht);
 | 
						|
    HashSink(const HashSink & h);
 | 
						|
    ~HashSink();
 | 
						|
    void write(const unsigned char * data, size_t len);
 | 
						|
    HashResult finish();
 | 
						|
    HashResult currentHash();
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
}
 |