public long Generate(IAtomContainer container)
        {
            long[] hashes  = generator.Generate(container);
            long[] rotated = new long[hashes.Length];

            Array.Sort(hashes);

            // seed with Mersenne prime 2^31-1
            long hash = 2147483647L;

            for (int i = 0; i < hashes.Length; i++)
            {
                // if non-unique, then get the next random number
                if (i > 0 && hashes[i] == hashes[i - 1])
                {
                    hash ^= rotated[i] = pseudorandom.Next(rotated[i - 1]);
                }
                else
                {
                    hash ^= rotated[i] = hashes[i];
                }
            }

            return(hash);
        }
Esempio n. 2
0
 /// <summary>
 /// Generate the next random number.
 /// </summary>
 /// <param name="seed">a <see cref="long"/> value to seed a pseudorandom number generator</param>
 /// <returns>next pseudorandom number</returns>
 public long Rotate(long seed)
 {
     return(pseudorandom.Next(seed));
 }