Преобразуйте список строк в один уникальный sha512 - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу знать, есть ли способ быстро преобразовать весь список строк в одну уникальную хеш-строку sha512.

Сейчас я использую этот метод для получения уникального хеша sha512, но так:становится все медленнее и медленнее, когда в списке появляется все больше и больше строк.

string hashDataList = string.Empty;

for (int i = 0; i < ListOfElement.Count; i++)
{
    if (i < ListOfElement.Count)
    {
        hashDataList += ListOfElement[i];
    }
}

hashDataList = MakeHash(HashDataList);

Console.WriteLine("Hash: "+hashDataList);

Редактировать:

Метод создания хэша:

    public static string MakeHash(string str)
    {
        using (var hash = SHA512.Create())
        {
            var bytes = Encoding.UTF8.GetBytes(str);
            var hashedInputBytes = hash.ComputeHash(bytes);

            var hashedInputStringBuilder = new StringBuilder(128);
            foreach (var b in hashedInputBytes)
                hashedInputStringBuilder.Append(b.ToString("X2"));

            str = hashedInputStringBuilder.ToString();
            hashedInputStringBuilder.Clear();
            GC.SuppressFinalize(bytes);
            GC.SuppressFinalize(hashedInputBytes);
            GC.SuppressFinalize(hashedInputStringBuilder);
            return str;
        }
    }

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я думаю, что проблема может быть немного искажена здесь.Сначала с точки зрения производительности:

Любой метод хеширования списка строк займет больше времени, так как количество (и длина) строк увеличивается.Единственный способ избежать этого - игнорировать некоторые данные в (по крайней мере, некоторых) строках, и тогда вы потеряете уверенность в том, что хеш должен дать вам.

Таким образом, вы можете попытаться сделатьВсе это происходит быстрее, так что вы можете обрабатывать больше (и / или больше) строк в приемлемые сроки.Не зная характеристик производительности функции хеширования, мы не можем сказать, возможно ли это;но, как следует из ответа farbiondriven, единственно возможной стратегией является сборка единственной строки и ее хеширование один раз.

Потенциальное возражение против этого, я полагаю, будет следующим: повлияет ли это на уникальность 1008* хешЕсть два фактора, которые необходимо учитывать:

Во-первых, если вы просто объедините все строки вместе, вы получите тот же хеш-код для

["element one and ", "element two"]

, что и для

["element one ", "and element two"]

потому что объединенные данные одинаковы.Один из способов исправить это - вставить длину каждой строки перед строкой (с разделителем для обозначения конца длины).Например, вы можете построить

"16:element one and 11:element two"

для первого вышеупомянутого массива и

"12:element one 15:and element two"

для второго.

Другая возможная проблема (хотя это не так)действительно допустимо) может возникнуть, если отдельные строки никогда не длиннее одного хеша SHA512, но общий объем данных в массиве равен.В этом случае ваш метод (хеширование каждой строки и объединение их) может показаться более безопасным, поскольку всякий раз, когда у вас есть данные, которые длиннее, чем фактический хеш, математически возможно для возникновения коллизии хеша.Но, как я уже сказал, эта проблема недопустима, по крайней мере, по одной, а возможно, и по двум причинам.

Самая большая причина заключается в том, что коллизии хэшей в 512-битном хэше невероятно маловероятны.Хотя математика говорит, что может произойти, нельзя с уверенностью предположить, что это буквально никогда не произойдет.Если вы будете беспокоиться о коллизии хешей на этом уровне, вы также можете беспокоиться о том, что ваши данные могут быть самопроизвольно повреждены из-за ошибок ОЗУ, которые происходят именно таким образом, чтобы избежать обнаружения.На этом уровне невероятности вы просто не можете программировать вокруг огромного количества катастрофических вещей, которые "могли бы" (но не будут) происходить, и вы действительно могли бы посчитать между ними коллизии хешей.

Вторая причина: если вы достаточно параноидальны, чтобы не покупать первую причину, то как вы можете быть уверены, что хеширование более коротких строк гарантирует уникальность?

Что делает объединение хеша для строки делает делатьесли отдельные строки меньше 512 битов, это означает, что хэш оказывается длиннее исходных данных, что противоречит типичным целям хэша.Если это приемлемо, то вам, вероятно, нужен алгоритм шифрования вместо хеша.

0 голосов
/ 10 декабря 2018

Попробуйте, используя встроенный SHA512:

StringBuilder sb = new StringBuilder();

foreach(string s in ListOfElement) 
{
    sb.Append(s);
}

hashDataList = BitConverter.ToString   (new System.Security.Cryptography.SHA512CryptoServiceProvider()
                           .ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()))).Replace("-", String.Empty).ToUpper();

Console.WriteLine("Hash: "+hashDataList);

Производительность также во многом зависит от реализации MakeHash ().

...