質問

このページ:

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

ハッシュを生成すると次のように表示されます:

ハッシュを16進文字列に変換

これを行うためにcsharpにコードがありますか?

役に立ちましたか?

解決

ハッシュを取得するには、 を使用しますSystem.Security.Cryptography.SHA1Managed クラス

編集:このように:

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

ハッシュを16進文字列に変換するには、次のコードを使用します。

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

他のヒント

まだコメントできませんが、十分な担当者はいませんが、LiorはJavaをC#と非常に間違った答えで混ぜています。

C#のバイトは符号なしバイトです。これは、デフォルトで署名されているC#の他のすべての整数型とは正反対です。

バイトが署名されていても、たとえば0xFEは-2であるため、0xFF部分は完全に無意味です。たとえば、0xFEと0xFFでビット単位のANDを使用しても、負の数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);

これはもう1つの「最適化」ですが、もっと読みやすいと思います。たぶんそれは私がASCIIテーブルのほとんどを心から知っているからでしょう。

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

小文字の16進数(ToLowerなし)を実現しようとしている場合は、55を87に交換するだけです。これにより、非常に簡単になります。

更新:Liorまたは誰かが彼の非常に間違った答えを削除したようです。それは良い動きでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top