문제
이 페이지에서 :
http://www.shutterfly.com/documentation/oflycallsignature.sfly
해시를 생성 한 후에는 다음과 같습니다.
해시를 16 진 문자 문자열로 변환하십시오
csharp에 이것을 할 코드가 있습니까?
해결책
해시를 얻으려면 System.Security.Cryptography.SHA1Managed
수업.
편집하다: 이와 같이:
byte[] hashBytes = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(str));
해시를 육각 문자열로 변환하려면 다음 코드를 사용하십시오.
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는 0xfe가 -2이기 때문에 0xff 부분은 완전히 무의미합니다. 예를 들어 비트와 0xfe 및 0xff와 함께 사용한다고해서 음수 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);
이것은 다른 "최적화"입니다. 어쩌면 나는 ASCII 테이블의 대부분을 마음으로 알고 있기 때문일 것입니다.
private static char ToHexDigit(int i)
{
return (char)(i + (i < 10 ? 48 : 55));
}
소문자 16 진수를 달성하려는 경우 (Tolower없이) 55를 87로 바꾸십시오. 아주 간단하게 만듭니다.
업데이트 : Lior 또는 누군가가 그의 대답을 제거한 것처럼 보입니다. 그것은 좋은 움직임이었습니다.