Преобразование хэша в шестнадцатеричную символьную строку

на странице:

http://www.shutterfly.com/documentation/OflyCallSignature.sfly

Он говорит, как только вы генерируете хэш, вы тогда:

преобразовать хэш в шестнадцатеричную строку символов

есть ли код в csharp для этого?

2 ответов


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

редактировать: например:

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);
}

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

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

часть 0xFF совершенно бессмысленна, потому что даже если байт был подписан, 0xFE, например, -2. Использование побитового - и с 0xFE и 0xFF, например, не остановит отрицательное число 0xFE от результата. 0х7f бы.

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

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

небольшое изменение, чтобы использовать bitshift и bitwise ops вместо делителя и по модулю.

    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));
    }

Если вы пытаетесь достичь нижнего регистра hex (без ToLower), просто замените 55 на 87. Это делает его довольно простым.

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