/// <summary> /// Insert hash into the RAM Storage. Be careful, there should be a Track object already inserted into the Storage. /// </summary> /// <param name = "hash">Hash signature that corresponds to a specific track</param> /// <param name = "type">Type of the hash to be inserted</param> public void InsertHash(HashSignature hash, HashType type) { switch (type) { case HashType.Query: _fingerprints[hash.Track].Query.Add(hash); break; case HashType.Creational: { _fingerprints[hash.Track].Creational.Add(hash); int[] signature = hash.Signature; lock (_hashTables.SyncRoot) /*Lock insertion in the hash-tables as it keys are verified*/ { for (int i = 0; i < _numberOfHashTables; i++) { if (!_hashTables[i].ContainsKey(signature[i])) { _hashTables[i][signature[i]] = new HashSet <Track>(); } _hashTables[i][signature[i]].Add(hash.Track); } } } break; } }
// ReSharper disable ReturnTypeCanBeEnumerable.Local private List <HashSignature> GetSignatures(IEnumerable <bool[]> fingerprints, Track track, int hashTables, int hashKeys) // ReSharper restore ReturnTypeCanBeEnumerable.Local { List <HashSignature> signatures = new List <HashSignature>(); foreach (bool[] fingerprint in fingerprints) { int[] signature = _hasher.ComputeMinHashSignature(fingerprint); /*Compute min-hash signature out of fingerprint*/ Dictionary <int, long> buckets = _hasher.GroupMinHashToLSHBuckets(signature, hashTables, hashKeys); /*Group Min-Hash signature into LSH buckets*/ int[] hashSignature = new int[buckets.Count]; foreach (KeyValuePair <int, long> bucket in buckets) { hashSignature[bucket.Key] = (int)bucket.Value; } HashSignature hash = new HashSignature(track, hashSignature); /*associate track to hash-signature*/ signatures.Add(hash); } return(signatures); /*Return the signatures*/ }