Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Revision 755ceefe33a9ef87482762f4381882c6ec974709 authored by Prashant Pandey on 30 November 2017, 16:57:50 UTC, committed by Prashant Pandey on 30 November 2017, 16:57:50 UTC
Adding Squeakr exact.
1 parent 485b9d5
  • Files
  • Changes
  • 956ce2f
  • /
  • hashutil.cc
Raw File Download
Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • revision
  • directory
  • content
revision badge
swh:1:rev:755ceefe33a9ef87482762f4381882c6ec974709
directory badge Iframe embedding
swh:1:dir:956ce2f472b305e4eb8e94c5f6517a54b70495f5
content badge Iframe embedding
swh:1:cnt:9897e57dd913629d376120388adef64285b7ffbb
Citations

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • revision
  • directory
  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
hashutil.cc
/*
 * =====================================================================================
 *
 *       Filename:  hashutil.cc
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  04/18/2016 04:49:32 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Prashant Pandey (ppandey@cs.stonybrook.edu)
 *                  Rob Patro (rob.patro@cs.stonybrook.edu)
 *                  Rob Johnson (rob@cs.stonybrook.edu)
 *   Organization:  Stony Brook University
 *
 * =====================================================================================
 */

#include "hashutil.h"


namespace kmercounting {

	//-----------------------------------------------------------------------------
	// MurmurHash2, 64-bit versions, by Austin Appleby

	// The same caveats as 32-bit MurmurHash2 apply here - beware of alignment 
	// and endian-ness issues if used across multiple platforms.


	// 64-bit hash for 64-bit platforms

	uint64_t HashUtil::MurmurHash64A ( const void * key, int len, unsigned int seed )
	{
		const uint64_t m = 0xc6a4a7935bd1e995;
		const int r = 47;

		uint64_t h = seed ^ (len * m);

		const uint64_t * data = (const uint64_t *)key;
		const uint64_t * end = data + (len/8);

		while(data != end)
		{
			uint64_t k = *data++;

			k *= m; 
			k ^= k >> r; 
			k *= m; 

			h ^= k;
			h *= m; 
		}

		const unsigned char * data2 = (const unsigned char*)data;

		switch(len & 7)
		{
			case 7: h ^= uint64_t(data2[6]) << 48;
			case 6: h ^= uint64_t(data2[5]) << 40;
			case 5: h ^= uint64_t(data2[4]) << 32;
			case 4: h ^= uint64_t(data2[3]) << 24;
			case 3: h ^= uint64_t(data2[2]) << 16;
			case 2: h ^= uint64_t(data2[1]) << 8;
			case 1: h ^= uint64_t(data2[0]);
							h *= m;
		};

		h ^= h >> r;
		h *= m;
		h ^= h >> r;

		return h;
	}


	// 64-bit hash for 32-bit platforms

	uint64_t HashUtil::MurmurHash64B ( const void * key, int len, unsigned int seed )
	{
		const unsigned int m = 0x5bd1e995;
		const int r = 24;

		unsigned int h1 = seed ^ len;
		unsigned int h2 = 0;

		const unsigned int * data = (const unsigned int *)key;

		while(len >= 8)
		{
			unsigned int k1 = *data++;
			k1 *= m; k1 ^= k1 >> r; k1 *= m;
			h1 *= m; h1 ^= k1;
			len -= 4;

			unsigned int k2 = *data++;
			k2 *= m; k2 ^= k2 >> r; k2 *= m;
			h2 *= m; h2 ^= k2;
			len -= 4;
		}

		if(len >= 4)
		{
			unsigned int k1 = *data++;
			k1 *= m; k1 ^= k1 >> r; k1 *= m;
			h1 *= m; h1 ^= k1;
			len -= 4;
		}

		switch(len)
		{
			case 3: h2 ^= ((unsigned char*)data)[2] << 16;
			case 2: h2 ^= ((unsigned char*)data)[1] << 8;
			case 1: h2 ^= ((unsigned char*)data)[0];
							h2 *= m;
		};

		h1 ^= h2 >> 18; h1 *= m;
		h2 ^= h1 >> 22; h2 *= m;
		h1 ^= h2 >> 17; h1 *= m;
		h2 ^= h1 >> 19; h2 *= m;

		uint64_t h = h1;

		h = (h << 32) | h2;

		return h;
	}

	/*
	 *   For any 1<k<=64, let mask=(1<<k)-1. hash_64() is a bijection on [0,1<<k),
	 *   which means
	 *     hash_64(x, mask)==hash_64(y, mask) if and only if x==y. hash_64i() is
	 *     the inversion of
	 *       hash_64(): hash_64i(hash_64(x, mask), mask) == hash_64(hash_64i(x,
	 *       mask), mask) == x.
	 */

	// Thomas Wang's integer hash functions. See
	// <https://gist.github.com/lh3/59882d6b96166dfc3d8d> for a snapshot.

	uint64_t HashUtil::hash_64(uint64_t key, uint64_t mask)
	{
		key = (~key + (key << 21)) & mask; // key = (key << 21) - key - 1;
		key = key ^ key >> 24;
		key = ((key + (key << 3)) + (key << 8)) & mask; // key * 265
		key = key ^ key >> 14;
		key = ((key + (key << 2)) + (key << 4)) & mask; // key * 21
		key = key ^ key >> 28;
		key = (key + (key << 31)) & mask;
		return key;
	}

	// The inversion of hash_64(). Modified from
	// <https://naml.us/blog/tag/invertible>
	uint64_t HashUtil::hash_64i(uint64_t key, uint64_t mask)
	{
		uint64_t tmp;

		// Invert key = key + (key << 31)
		tmp = (key - (key << 31));
		key = (key - (tmp << 31)) & mask;

		// Invert key = key ^ (key >> 28)
		tmp = key ^ key >> 28;
		key = key ^ tmp >> 28;

		// Invert key *= 21
		key = (key * 14933078535860113213ull) & mask;

		// Invert key = key ^ (key >> 14)
		tmp = key ^ key >> 14;
		tmp = key ^ tmp >> 14;
		tmp = key ^ tmp >> 14;
		key = key ^ tmp >> 14;

		// Invert key *= 265
		key = (key * 15244667743933553977ull) & mask;

		// Invert key = key ^ (key >> 24)
		tmp = key ^ key >> 24;
		key = key ^ tmp >> 24;

		// Invert key = (~key) + (key << 21)
		tmp = ~key;
		tmp = ~(key - (tmp << 21));
		tmp = ~(key - (tmp << 21));
		key = ~(key - (tmp << 21)) & mask;

		return key;
	}

}	// namespace kmercounting
The diff you're trying to view is too large. Only the first 1000 changed files have been loaded.
Showing with 0 additions and 0 deletions (0 / 0 diffs computed)
swh spinner

Computing file changes ...

back to top

Software Heritage — Copyright (C) 2015–2025, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Contact— JavaScript license information— Web API