X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fparse.c;h=fd139218506c0ab91a4aa449cd22217a6b11d1cd;hb=229848ff462383b1fba2a073e5f7139856d2873d;hp=8a6123e9b97f14e6818421e8d2a9f06303fad78c;hpb=a7a328a691ab370ed7fd61c9c04af9def02395d5;p=fastq-tools.git diff --git a/src/parse.c b/src/parse.c index 8a6123e..fd13921 100644 --- a/src/parse.c +++ b/src/parse.c @@ -66,6 +66,88 @@ void seq_free(seq_t* seq) } +/* This is MurmurHash3. The original C++ code was placed in the public domain + * by its author, Austin Appleby. */ + +static inline uint32_t fmix(uint32_t h) +{ + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + + return h; +} + + +static inline uint32_t rotl32(uint32_t x, int8_t r) +{ + return (x << r) | (x >> (32 - r)); +} + + +uint32_t murmurhash3(const uint8_t* data, size_t len_) +{ + const int len = (int) len_; + const int nblocks = len / 4; + + uint32_t h1 = 0xc062fb4a; + + uint32_t c1 = 0xcc9e2d51; + uint32_t c2 = 0x1b873593; + + //---------- + // body + + const uint32_t * blocks = (const uint32_t*) (data + nblocks * 4); + + int i; + for(i = -nblocks; i; i++) + { + uint32_t k1 = blocks[i]; + + k1 *= c1; + k1 = rotl32(k1, 15); + k1 *= c2; + + h1 ^= k1; + h1 = rotl32(h1, 13); + h1 = h1*5+0xe6546b64; + } + + //---------- + // tail + + const uint8_t * tail = (const uint8_t*)(data + nblocks*4); + + uint32_t k1 = 0; + + switch(len & 3) + { + case 3: k1 ^= tail[2] << 16; + case 2: k1 ^= tail[1] << 8; + case 1: k1 ^= tail[0]; + k1 *= c1; k1 = rotl32(k1,15); k1 *= c2; h1 ^= k1; + } + + //---------- + // finalization + + h1 ^= len; + + h1 = fmix(h1); + + return h1; +} + + +uint32_t seq_hash(const seq_t* seq) +{ + /* TODO */ + return 0; +} + static const size_t parser_buf_size = 1000000;