Pergunta

nessa página:

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

ele diz que uma vez que você gerar um hash você então:

converter o hash para uma cadeia de caracteres hexadecimal

Existe código csharp para fazer isso?

Foi útil?

Solução

Para obter o hash, use a classe System.Security.Cryptography.SHA1Managed .

Editar : Como esta:

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

Para converter o hash para uma cadeia hexadecimal, use o seguinte código:

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

Se você quer uma implementação mais rápida, use a seguinte função:

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

Outras dicas

Não posso comentar ainda, não o suficiente rep, mas Lior é a mistura de Java com C # em uma resposta muito errado.

byte em C # é um byte não assinado, que é o oposto completo de todos os outros tipos de números inteiros em C #, que são assinados por padrão.

A parte 0xFF é completamente inútil porque mesmo se byte foi assinado, 0xFE por exemplo é de -2. Usando um bit a bit e com 0xFE e 0xFF, por exemplo, não parava número negativo 0xFE de ser o resultado. 0x7F faria.

Em relação à resposta superior, eu tenho certeza que estes micro-otimizações podem ajudar, embora, eles são micro-otimizações que são susceptíveis de não fazer qualquer diferença real, porque o compilador JIT pode simplesmente fazer outra coisa e porque os computadores são demais super rápido.

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

Pequena alteração para torná-lo usar bitshift e bit a bit ops, em vez do divisor e modulo.

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

Este é o outro "otimização", embora eu vejo isso como uma coisa mais legível. Talvez seja porque eu sei que a maioria da tabela ASCII pelo coração.

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

Se você está tentando alcançar menor hex caso (sem ToLower), basta trocar 55 com 87. Isso torna bastante simples.

Update: Parece que Lior ou alguém removeu seu muito off resposta. Essa foi uma boa jogada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top