1 /// Implementation of CityHash digester.
2 module tern.digest.cityhash;
3 
4 import tern.digest;
5 import tern.serialization;
6 
7 /**
8  * Implementation of CityHash digester.
9  *
10  * CityHash is a family of hash functions developed by Google.
11  * It provides fast and strong hash functions for hash tables and checksums.
12  *
13  * Example:
14  * ```d
15  * import tern.digest.cityhash;
16  * 
17  * ubyte[] data = [1, 2, 3, 4, 5];
18  * auto hashValue = CityHash.hash(data);
19  * ```
20  */
21 public static @digester class CityHash
22 {
23 public:
24 static:
25 pure:
26     /**
27      * Computes the CityHash digest of the given data.
28      *
29      * Params:
30      *  data = The input byte array for which the CityHash digest is to be computed.
31      *
32      * Returns:
33      *  A byte array representing the computed CityHash digest.
34      */
35     ubyte[] hash(ubyte[] data)
36     {
37         ulong seed = 0x9ae16a3b2f90404f;
38         ulong m = 0xc6a4a7935bd1e995;
39         ulong r = 47;
40         ulong h = seed + (data.length * m);
41 
42         size_t i = 0;
43         foreach_reverse (j; 0..(data.length / 8))
44         {
45             ulong k = data[i..i+8].deserialize!ulong();
46             i += 8;
47             k *= m;
48             k ^= k >> r;
49             k *= m;
50             h ^= k;
51             h *= m;
52         }
53 
54         if (data.length % 8 != 0)
55         {
56             ulong k = 0;
57             foreach (j; 0..(data.length % 8))
58                 k |= (data[i + j] << (8 * j));
59 
60             k *= m;
61             k ^= k >> r;
62             k *= m;
63             h ^= k;
64         }
65 
66         h ^= h >> r;
67         h *= m;
68         h ^= h >> r;
69 
70         return h.serialize!true();
71     }
72 }