Converter hash para uma cadeia de caracteres hexadecimal
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?
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.