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); }
/// <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)); }