2009-09-17 2 views

ответ

10

Чтобы получить хэш, используйте System.Security.Cryptography.SHA1Managed class.

EDIT: Как это:

byte[] hashBytes = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(str)); 

Чтобы преобразовать хэш шестнадцатеричной строки, используйте следующий код:

BitConverter.ToString(hashBytes).Replace("-", ""); 

Если вы хотите более быстрое выполнение, используйте следующую функцию :

private static char ToHexDigit(int i) { 
    if (i < 10) 
     return (char)(i + '0'); 
    return (char)(i - 10 + 'A'); 
} 
public static string ToHexString(byte[] bytes) { 
    var chars = new char[bytes.Length * 2 + 2]; 

    chars[0] = '0'; 
    chars[1] = 'x'; 

    for (int i = 0; i < bytes.Length; i++) { 
     chars[2 * i + 2] = ToHexDigit(bytes[i]/16); 
     chars[2 * i + 3] = ToHexDigit(bytes[i] % 16); 
    } 

    return new string(chars); 
} 
1

Вот sample code, который делает именно это.

+0

Почему нижняя сторона? BTW csharp-online.net имеет некоторые v. Классные вещи .. – russau

+0

ссылка сейчас мертва. – Yablargo

1

Я еще не могу прокомментировать, но недостаточно, но Lior смешивает Java с C# в очень неправильном ответе.

байт в C# является неподписанным байтом, который является полной противоположностью всем другим целым числам в C#, которые по умолчанию подписаны.

Часть 0xFF совершенно бессмысленна, потому что даже если байт был подписан, 0xFE, например, -2. Например, использование побитового и с 0xFE и 0xFF не приведет к отрицательному числу 0xFE. 0x7F.

Что касается верхнего ответа, я уверен, что эти микро-оптимизации могут помочь, хотя они и являются микро-оптимизациями, которые вряд ли будут иметь какое-либо значение, поскольку компилятор JIT может просто сделать что-то еще и потому что компьютеры просто слишком быстро растут.

chars[2 * i + 2] = ToHexDigit(bytes[i]/16); 
    chars[2 * i + 3] = ToHexDigit(bytes[i] % 16); 

Небольшое изменение, позволяющее использовать битдвиг и побитовые операционные системы вместо делителя и модуля.

chars[2 * i + 2] = ToHexDigit((bytes[i] >> 4) & 0xF); 
    chars[2 * i + 3] = ToHexDigit(bytes[i] & 0xF); 

Это еще одна «оптимизация», хотя я считаю ее более читаемой. Возможно, это потому, что я наизусть знаю таблицу ASCII.

private static char ToHexDigit(int i) 
    { 
     return (char)(i + (i < 10 ? 48 : 55)); 
    } 

Если вы пытаетесь достичь строчного шестигранника (без TOLOWER), просто поменять местами 55 с 87. Это делает его довольно просто.

Обновление: похоже, Лиор или кто-то удалил свой очень ответ. Это был хороший шаг.