2013-05-15 3 views
2

Недавно я заметил, что алгоритм SHA вычисляет хеши со случайной длиной.SHA вычисляет хеши со случайной длиной

HashAlgorithm provider; 
provider = HashAlgorithm.Create("System.Security.Cryptography.SHA256"); 

while(!stackoverflow) { 
    Console.WriteLine(Encoding.UTF8.GetString(
     provider.ComputeHash(Encoding.UTF8.GetBytes(
       (new Random()).Next().ToString()))) 
     .Count().ToString()); 
} 

Выходы:

29 
29 
30 
29 
29 
30 
29 
31 
29 
29 
32 
29 
30 
28 
... 

Можно ли установить максимальную длину хэш? (Может ли сделать хэш бесполезным ..) Или я делаю что-то неправильно при вычислении хэшей? Кодирование?

Edit:

Сниппет выше всего лишь пример. В конце концов, мне нужен метод, который принимает строку, вычисляет хэш строки и возвращает ее. HashAlgorithm.ComputeHash берет байты и возвращает байты, поэтому я использовал UTF8.GetBytes()/UTF8.GetString() для преобразования, что кажется огромной ошибкой.

ответ

5

Хеши SHA1-256 всегда имеют длину 32 байта. То, что вы здесь делаете, заключается в том, что вы пытаетесь интерпретировать эти байты как кодированный текст UTF-8, что совершенно неправильно, потому что нет абсолютно никакой гарантии, что хэш-байты являются допустимой последовательностью в кодировке UTF8.

Даже если бы была такая гарантия, UTF-8 является кодировкой переменной длины: при преобразовании необработанных байтов в символы Unicode вы «используете» переменное количество байтов (от 1 до 4) на символ, поэтому вывод из этот код теоретически может быть где угодно между 8 и 32.

В целом, пример не имеет смысла. Просьба уточнить, каковы ваши намерения.

+0

Значит, другая кодировка могла бы исправить это? ASCII? Unicode? Я только что увидел, что с ASCII вывод всегда 32 символа. С unicode это 16. – Atrotygma

+0

Вопрос в следующем: * что вы пытаетесь сделать? * – Jon

+0

Мое намерение состоит в создании случайного и уникального хеша для его использования в качестве идентификатора. В моем «реальном» приложении другие части становятся хешированными, чтобы гарантировать уникальность и случайность. Фрагмент выше - всего лишь пример. То, что я хотел бы иметь, это хэш шестнадцатеричных символов с фиксированной длиной. Но это также общий вопрос «кодирования/криптографии», поскольку я также использую UTF8.GetString/UTF8.GetBytes вместе с генерацией ключей RSA. – Atrotygma

Смежные вопросы