Как возвращать число в неэкспоненциальной форме C#?

Есть метод создания хеш-функции:

private static double GenerateHash(string number)
{
    var s = 0d;
    for (var i = 1; i <= 20; i++) 
        s += Math.Pow(300, 20 - i) * number[i - 1];
    s %= 1000000000000000;
    return s;
}

number[i - 1] - это ASCII код символа
number всегда длинее 19 символов

До строки s %= 1000000000000000; s выглядит примерно так: 1.234E+40.
Например, при number = 00000000000000000000 до строки s %= 1000000000000000; s = 5.5975134196655518E+48.

Экспоненциальная форма очень сильно округляет число, как сделать так, чтобы число было записано целиком?

Пробовал использовать ulong и long вместо double формата, но по какой-то причине в обоих случаях при первой итерации фора s уходило в минус, а при всех последующих итерациях было равно 0.
Также сделал эквивалент данного кода в питоне и там число выводится полностью.

def get_hash(number):
    n = len(number)
    s = 0
    for i in range(1, n + 1):
        s += (300 ** (n - i)) * ord(number[i - 1])
    s %= 1000000000000000
    return s

Ответы (1 шт):

Автор решения: aepot

Я в питоне не шарю, но раз говорят, что

В питоне целые числа неограниченной длины.

То получится как-то так

static void Main(string[] args)
{
    long hash = GenerateHash("hello");
    Console.WriteLine(hash);
}

private static long GenerateHash(string number)
{
    int n = number.Length;
    BigInteger s = 0;
    for (int i = 1; i <= n; i++)
        s += BigInteger.Pow(300, n - i) * number[i - 1];
    s %= 1000000000000000;
    return (long)s;
}

Вывод в консоль

845136752511
→ Ссылка