Example #1
0
        /// <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*/
        }