Domanda

in questa pagina:

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

dice che una volta generato un hash allora:

converti l'hash in una stringa di caratteri esadecimali

c'è del codice in csharp per farlo?

È stato utile?

Soluzione

Per ottenere l'hash, utilizzare System.Security.Cryptography.SHA1Managed class .

MODIFICA : in questo modo:

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

Per convertire l'hash in una stringa esadecimale, utilizzare il seguente codice:

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

Se si desidera un'implementazione più rapida, utilizzare la seguente funzione:

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

Altri suggerimenti

Non posso ancora commentare, non abbastanza rappresentante, ma Lior sta mescolando Java con C # in una risposta molto sbagliata.

byte in C # è un byte senza segno, che è l'esatto contrario di tutti gli altri tipi di numeri interi in C #, che sono firmati per impostazione predefinita.

La parte 0xFF è completamente inutile perché anche se il byte è stato firmato, 0xFE per esempio è -2. L'uso di un bit per bit e con 0xFE e 0xFF, ad esempio, non impedirebbe che il risultato negativo sia 0xFE. 0x7F sarebbe.

Per quanto riguarda la risposta migliore, sono abbastanza sicuro che queste micro-ottimizzazioni potrebbero aiutare, anche se, sono micro-ottimizzazioni che probabilmente non faranno alcuna differenza reale perché il compilatore JIT potrebbe semplicemente fare qualcos'altro e perché i computer sono troppo veloce.

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

Piccola modifica per renderlo utilizza bithift e bit per bit invece del divisore e del modulo.

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

Questa è l'altra "ottimizzazione", anche se la vedo come una cosa più leggibile. Forse è perché conosco la maggior parte della tabella ASCII a memoria.

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

Se stai cercando di ottenere un esagono minuscolo (senza ToLower), scambia 55 con 87. È abbastanza semplice.

Aggiornamento: sembra che Lior o qualcuno abbiano rimosso la sua risposta. È stata una buona mossa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top