Pregunta

en esta página:

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

dice que una vez que generas un hash, entonces:

convierte el hash en una cadena de caracteres hexadecimales

¿hay código en csharp para hacer esto?

¿Fue útil?

Solución

Para obtener el hash, use el System.Security.Cryptography.SHA1Managed class .

EDITAR : así:

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

Para convertir el hash en una cadena hexadecimal, use el siguiente código:

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

Si desea una implementación más rápida, use la siguiente función:

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

Otros consejos

No puedo comentar todavía, no hay suficiente representante, pero Lior está mezclando Java con C # en una respuesta muy incorrecta.

byte en C # es un byte sin signo, que es el opuesto completo de todos los demás tipos de números enteros en C #, que están firmados de manera predeterminada.

La parte 0xFF es completamente inútil porque incluso si el byte fue firmado, 0xFE por ejemplo es -2. El uso de un bit a bit y con 0xFE y 0xFF, por ejemplo, no evitaría que el número negativo 0xFE sea el resultado. 0x7F lo haría.

Con respecto a la respuesta principal, estoy bastante seguro de que estas microoptimizaciones podrían ayudar, aunque sean microoptimizaciones que probablemente no hagan una diferencia real porque el compilador JIT podría hacer otra cosa y porque las computadoras son demasiado rápido.

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

Pequeño cambio para hacer que use bithift y bitwise ops en lugar del divisor y módulo.

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

Esta es la otra "optimización", aunque lo veo como algo más legible. Tal vez sea porque sé la mayor parte de la tabla ASCII de memoria.

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

Si está tratando de lograr un hexadecimal en minúscula (sin ToLower), simplemente cambie 55 por 87. Esto lo hace bastante simple.

Actualización: Parece que Lior o alguien eliminó su respuesta incorrecta. Ese fue un buen movimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top