HashHelpers
using System.Runtime.CompilerServices;
namespace System.Collections
{
internal static class HashHelpers
{
public const uint HashCollisionThreshold = 100;
public const int MaxPrimeArrayLength = 2147483587;
public const int HashPrime = 101;
internal static ReadOnlySpan<int> Primes {
get {
object obj = global::<PrivateImplementationDetails>.74BCD6ED20AF2231F2BB1CDE814C5F4FF48E54BAC46029EEF90DDF4A208E2B20_A6;
if (obj == null) {
obj = new int[72] {
3,
7,
11,
17,
23,
29,
37,
47,
59,
71,
89,
107,
131,
163,
197,
239,
293,
353,
431,
521,
631,
761,
919,
1103,
1327,
1597,
1931,
2333,
2801,
3371,
4049,
4861,
5839,
7013,
8419,
10103,
12143,
14591,
17519,
21023,
25229,
30293,
36353,
43627,
52361,
62851,
75431,
90523,
108631,
130363,
156437,
187751,
225307,
270371,
324449,
389357,
467237,
560689,
672827,
807403,
968897,
1162687,
1395263,
1674319,
2009191,
2411033,
2893249,
3471899,
4166287,
4999559,
5999471,
7199369
};
global::<PrivateImplementationDetails>.74BCD6ED20AF2231F2BB1CDE814C5F4FF48E54BAC46029EEF90DDF4A208E2B20_A6 = (int[])obj;
}
return new ReadOnlySpan<int>((int[])obj);
}
}
public static bool IsPrime(int candidate)
{
if ((candidate & 1) != 0) {
int num = (int)Math.Sqrt((double)candidate);
for (int i = 3; i <= num; i += 2) {
if (candidate % i == 0)
return false;
}
return true;
}
return candidate == 2;
}
public static int GetPrime(int min)
{
if (min < 0)
throw new ArgumentException(System.SR.Arg_HTCapacityOverflow);
ReadOnlySpan<int> primes = Primes;
foreach (int num in primes) {
if (num >= min)
return num;
}
for (int j = min | 1; j < 2147483647; j += 2) {
if (IsPrime(j) && (j - 1) % 101 != 0)
return j;
}
return min;
}
public static int ExpandPrime(int oldSize)
{
int num = 2 * oldSize;
if ((uint)num > 2147483587 && 2147483587 > oldSize)
return 2147483587;
return GetPrime(num);
}
public static ulong GetFastModMultiplier(uint divisor)
{
return ulong.MaxValue / (ulong)divisor + 1;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static uint FastMod(uint value, uint divisor, ulong multiplier)
{
return (uint)(((multiplier * value >> 32) + 1) * divisor >> 32);
}
}
}