2011-11-17 4 views
0

는, 내가 사용하는 코드는 다음과 같습니다 :전체 문자셋을 사용하는 MD5, 문자열을 짧게 만드십시오. 나는 C#에서 쉽게 MD5를 사용할 수 있습니다 알고

using System.Security.Cryptography; 
public static string MD5(string input) 
{ 
    MD5CryptoServiceProvider x = new MD5CryptoServiceProvider(); 
    byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 
    bs = x.ComputeHash(bs); 
    System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    foreach (byte b in bs) 
    { 
     s.Append(b.ToString("x2").ToLower()); 
    } 
    return s.ToString(); 
} 

일반적으로, MD5 문자열은 0-9과-F 32 개 문자 깁니다. 0-9 A-Z a-z와 _를 사용하면 궁금합니다. - 등 64자를 설정하고, MD5 문자열은 더 짧아 질 것입니다. MD5 문자열을 사용하여 무언가를 식별하고 데이터베이스에 저장합니다. 짧은 문자열은 동일한 작업을 수행 할 수 있고 공간을 적게 차지할 수 있으며 색인 생성 시간은 단축됩니다. 그래서 여기

, 내 질문은, 사람이

추신 0-9A-ZA-z._ 문자열로 0-9A-F 문자열을 변경하는 빠른 방법이 여기에있다 MD5 문자열을 int로 바꾸는 것이 가장 좋은 생각입니다. 매우 큰 크기가 될 것입니다. 그런 다음 charset이있는 문자열로 전송하십시오. 천천히 움직일 수 있습니다.

아이디어가 도움이됩니다. 감사.

[편집]

는 나뿐만 아니라 URL의 일부로 필요하기 때문에 결국 나는 내 자신의 일, 내가 문자열이 필요 을 출시, 당신에게 모두 감사드립니다. 고정 길이 문자열을 원하기 때문에 Base64를 사용하지 않습니다.

MD5 16 개 문자이고, 길이는 64 개 문자 I로 변경 될 때, 길이가 20 여기

가되고, 32 I 사용 업데이트 함수이다.

public static string MD520(string input) 
{ 
    char[] chars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '-', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; 
    MD5CryptoServiceProvider x = new MD5CryptoServiceProvider(); 
    byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 
    bs = x.ComputeHash(bs); 
    System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    byte m = 0; 
    int c = 0; 
    foreach (byte b in bs) 
    { 
     if (m == 2) 
     { 
      c = c * b; 
      for (byte i = 0; i < 4; i++) 
      { 
       int n = c % 64; 
       s.Append(chars[n]); 
       c = (c - n)/64; 
      } 
      m = 0; 
     } 
     else 
     { 
      c = ((m > 0) ? c : 1) * b; 
      m++; 
     } 
    } 
    return s.ToString(); 
} 

답변

0

대신

System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    foreach (byte b in bs) 
    { 
     s.Append(b.ToString("x2").ToLower()); 
    } 
    return s.ToString(); 

의 당신은

return Convert.ToBase64String(bs); 

이 짧은 문자열 발생하지만 전체 문자 집합을 사용하지 않습니다 사용할 수 있습니다. 이미 사용자가 가지고있는 것을 의심하지는 않지만 사용자 지정 인코딩을 만들어야합니다.

1

가능한 한 적은 공간에 저장하려면 바이트를 저장하십시오. 코드가 수행하는 것처럼 문자열로 변환하지 마십시오. 32 바이트 데이터입니다. 기간. 그것을 문자열로 표시함으로써, 당신은 2 번 또는 4 번 또는 그 이상으로 balooning합니다.

는 먼저 그것을 baloon입니다하지 않습니다 ... 일부 사용자 지정 방식을 롤하지 마십시오. 당신이 정말로 그것을 읽을 문자열을 할 필요가없는 경우

단지 바이너리 필드를 사용

+0

URL의 일부이기 때문에 문자열을 사용해야합니다. MD5는 약하지만 그냥 태그를 동일하게 사용하는지, 심지어 충돌인지는 중요하지 않습니다. –

0

(또한, MD5는 바로?, 당신도 알다시피, 지금은 약한 것으로 간주됩니다). 그렇지 않으면 Base64를 사용하는 것이 가장 편리합니다.

+0

이 답변은 질문자가 짝수 * 긴 * 문자열로 끝날 가능성이 높습니다. 문자열이 아니라 바이트. 그것은 명확해야한다. –

관련 문제