哈希算法SHA1,SHA256,SHA384,SHA512

http://blog.sina.com.cn/s/blog_4fcd1ea301013sl6.html

sha256
#include 
#include 
#include 
//#define DEBUG 1 
#define RoundNum 64 
#define BlockWidthNum 16 
#define ConstNum 8 
unsigned int H[ConstNum] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; 
unsigned int K[RoundNum] = { 
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; 
 
unsigned int M[BlockWidthNum]; 
unsigned int W[RoundNum]; 
unsigned char LastString[BlockWidthNum*4*2]; 
FILE * fp; 
fpos_t pos; //文件长度 
int flag ;  
int LastRoundCount; 
 
int GetMessage(unsigned long long rLen); 
void SetW(); 
void Round(); 
unsigned int ShiftNum3(unsigned int input, int OpOne, int OpTwo, int Opthree); 
 
int main(int argc, char *argv[]) 

//  fp = fopen(argv[1],"rb"); 
    if(!(fp = fopen(argv[1],"rb"))) 
    { 
        exit(1); 
    } 
    clock_t start, finish;   
    start = clock();   
     
    fseek(fp, 0, SEEK_END); 
    fgetpos(fp, &pos); 
 
    unsigned long long realLen = pos; 
 
    memset(LastString,0x00,strlen(LastString)*sizeof(unsigned char)); 
     
    int LastOut = realLen%(BlockWidthNum*4); 
    fseek(fp,-1*LastOut,SEEK_END); 
 
    int i; 
    fread(LastString,LastOut,1,fp); 
    LastString[LastOut] = 0x80;  
     
    LastRoundCount = 1; 
    flag = 0; 
 
    if( LastOut <= BlockWidthNum*4-1-8) 
    { 
        flag = 1; 
    //  memcpy(LastString+512/8-8,&copyLen,8); 
        for( i = 8; i >= 1; i--) 
            LastString[512/8 - i] = (char)((realLen<<3)>>((i-1)*8));  
    } 
    else 
    { 
        flag = 2; 
    //  memcpy(LastString+512/8*2-8,&copyLen,8); 
        for( i = 1; i <= 8; i++) 
            LastString[512/8*2 - i] = (char)((realLen<<3)>>((i-1)*8));  
    } 
 
    realLen -= LastOut; 
 
    fseek(fp,0,SEEK_SET); 
     
    while(GetMessage(realLen)) 
    { 
        SetW(); 
        Round(); 
    } 
     
    printf("SHA256:  "); 
    for(i = 0 ; i < ConstNum; i++) 
        printf("x",H[i]); 
    printf("\n");  
     
    finish = clock();   
    double duration = (double)(finish - start) / CLOCKS_PER_SEC;  
    printf("Cal time: %f seconds\n",duration); 
    fclose(fp); 
    return 0; 

 
int GetMessage(unsigned long long rLen) 

    fgetpos(fp, &pos); 
 
    unsigned char temp[4]; 
    if(pos + 16*4 <= rLen ) 
    { 
         
        fread(M,4,16,fp); 
        return 1; 
    } 
    if(LastRoundCount <= flag) 
    { 
        memcpy(M,(LastString+512/8*(LastRoundCount - 1)),64);//最后的一段或是两段 
        LastRoundCount++; 
        return 1; 
    } 
    else 
        return 0; //false;   

void SetW() 

    int index = 0; 
//  memcpy(W,M,16*4); 
 
    for(index = 0; index <= 15;index++) 
    { 
        W[index] = (M[index]>>24)|(M[index]<<24)|((M[index]&0x00ff0000)>>8)|((M[index]&0x0000ff00)<<8); 
    }  
    unsigned int s0 = 0, s1 = 0; 
    for(index = 16; index < RoundNum; index++) 
    { 
        s0 = 0; 
        s1 = 0; 
        s0 = ShiftNum3(W[index-2],17,19,-10); 
        s1 = ShiftNum3(W[index-15],7,18,-3); 
        W[index] = (s0 + W[index-7] + s1 + W[index-16]); 
//      printf(" x ", W[index]); 
    } 

 
unsigned int ShiftNum3(unsigned int input, int OpOne, int OpTwo, int Opthree) 

    unsigned int Ans = 0 ;  
    Ans ^= ((input >> OpOne)|(input<<(32-OpOne))); 
    Ans ^= ((input >> OpTwo)|(input<<(32-OpTwo))); 
    if(Opthree > 0) 
        Ans ^= ((input >> Opthree)|(input<<(32-Opthree))); 
    else 
    { 
    //  printf("%d",Opthree); 
        Opthree = 0 - Opthree; 
    //  printf("%d",Opthree); 
        Ans ^= (input >> Opthree); 
    } 
    return Ans; 

 
void Round() 

    unsigned int A,B,C,D,E,F,G,I; 
    A = H[0]; 
    B = H[1]; 
    C = H[2]; 
    D = H[3]; 
    E = H[4]; 
    F = H[5]; 
    G = H[6]; 
    I = H[7]; 
     
    int index = 0; 
    unsigned int t1 = 0, t2= 0, s0 = 0, s1 = 0; 
    for(index = 0;index < RoundNum ;index++) 
    { 
        s0 = 0; 
        s1 = 0; 
        s0 = ShiftNum3(A, 2, 13, 22); 
        t2 = s0 + ((A&B)^(A&C)^(B&C)); 
        s1 = ShiftNum3(E, 6, 11, 25); 
        t1 = I + s1 + ((E&F)^((~E)&G)) + K[index] + W[index]; 
         
        I = G; 
        G = F; 
        F = E; 
        E = D + t1; 
        D = C; 
        C = B; 
        B = A; 
        A = t1 + t2; 
#ifdef DEBUG 
    printf("ABCDE  %x %x %x %x %x \n",A,B,C,D,E); 
    system("pause"); 
#endif 
    } 
 
    H[0]+=A; 
    H[1]+=B; 
    H[2]+=C; 
    H[3]+=D; 
    H[4]+=E; 
    H[5]+=F; 
    H[6]+=G; 
    H[7]+=I; 
}

sha384

sha512
#include 
#include 
#include 
//#define DEBUG 1 
#define RoundNum 80 
#define BlockWidthNum 16 
#define ConstNum 8 
unsigned long long H[ConstNum] = { 
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,  
0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179}; 
unsigned long long K[RoundNum] = { 
0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,  
0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,  
0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,  
0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,  
0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,  
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,  
0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,  
0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,  
0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,  
0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,  
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,  
0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,  
0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,  
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,  
0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,  
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,  
0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,  
0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,  
0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,  
0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; 
 
unsigned long long M[BlockWidthNum]; 
unsigned long long W[RoundNum]; 
unsigned char LastString[BlockWidthNum*8*2]; 
FILE * fp; 
fpos_t pos; //文件长度 
int flag ;  
int LastRoundCount; 
 
int GetMessage(unsigned long long rLen); 
void SetW(); 
void Round(); 
unsigned long long ShiftNum3(unsigned long long input, int OpOne, int OpTwo, int Opthree); 
 
int main(int argc, char *argv[]) 

//  fp = fopen(argv[1],"rb"); 
    if(!(fp = fopen(argv[1],"rb"))) 
    { 
        exit(1); 
    } 
    clock_t start, finish;   
    start = clock();   
     
    fseek(fp, 0, SEEK_END); 
    fgetpos(fp, &pos); 
 
    unsigned long long realLen = pos;//暂时不支持hash超大文件 
 
    memset(LastString,0x00,strlen(LastString)*sizeof(unsigned char)); 
     
    int LastOut = realLen%(BlockWidthNum*8); 
    fseek(fp,-1*LastOut,SEEK_END); 
 
    int i; 
    fread(LastString,LastOut,1,fp); 
    LastString[LastOut] = 0x80;  
     
    LastRoundCount = 1; 
    flag = 0; 
//暂时不支持hash大小超过2^64的文件, 
//sha512更长了,这样更加安全了,但是也不一定要hash这种超大的文件 
    if( LastOut <= BlockWidthNum*8-1-16) 
    { 
        flag = 1; 
    //  memcpy(LastString+512/8-8,&copyLen,8); 
        for( i = 8; i >= 1; i--) 
            LastString[BlockWidthNum*8 - i] = (char)((realLen<<3)>>((i-1)*8));  
    } 
    else 
    { 
        flag = 2; 
    //  memcpy(LastString+512/8*2-8,&copyLen,8); 
        for( i = 1; i <= 8; i++) 
            LastString[BlockWidthNum*8*2 - i] = (char)((realLen<<3)>>((i-1)*8));  
    } 
 
    realLen -= LastOut; 
 
    fseek(fp,0,SEEK_SET); 
     
    while(GetMessage(realLen)) 
    { 
        SetW(); 
        Round(); 
    } 
     
    printf("SHA512:  "); 
    for(i = 0 ; i < ConstNum; i++) 
        printf("6llx",H[i]); 
    printf("\n");  
     
    finish = clock();   
    double duration = (double)(finish - start) / CLOCKS_PER_SEC;  
    printf("Cal time: %f seconds\n",duration); 
    fclose(fp); 
    return 0; 

 
int GetMessage(unsigned long long rLen) 

    fgetpos(fp, &pos); 
 
    if(pos + 16 * 8 <= rLen ) 
    { 
        fread(M,8,16,fp); 
        return 1; 
    } 
    if(LastRoundCount <= flag) 
    { 
        memcpy(M,(LastString+BlockWidthNum*8*(LastRoundCount - 1)),BlockWidthNum*8);//最后的一段或是两段 
        LastRoundCount++; 
        return 1; 
    } 
    else 
        return 0; //false;   

void SetW() 

    int index = 0; 
//  memcpy(W,M,16*4); 
 
    for(index = 0; index <= 15;index++) 
    { 
        W[index] = (M[index]>>56)|(M[index]<<56)|((M[index]&0x00ff000000000000)>>40)|((M[index]&0x000000000000ff00)<<40) 
                    |((M[index]&0x0000ff0000000000)>>24)|((M[index]&0x0000000000ff0000)<<24)|((M[index]&0x000000ff00000000)>>8)|((M[index]&0x00000000ff000000)<<8); 
//      printf("6llx ",W[index]); 
    }  
    unsigned long long s0 = 0, s1 = 0; 
    for(index = 16; index < RoundNum; index++) 
    { 
        s0 = 0; 
        s1 = 0; 
        s0 = ShiftNum3(W[index-2],19,61,-6); 
        s1 = ShiftNum3(W[index-15],1,8,-7); 
        W[index] = (s0 + W[index-7] + s1 + W[index-16]); 
//      printf("6llx ",W[index]); 
    } 

 
unsigned long long ShiftNum3(unsigned long long input, int OpOne, int OpTwo, int Opthree) 

    unsigned long long Ans = 0 ;  
    Ans ^= ((input >> OpOne)|(input<<(64-OpOne))); 
    Ans ^= ((input >> OpTwo)|(input<<(64-OpTwo))); 
    if(Opthree > 0) 
        Ans ^= ((input >> Opthree)|(input<<(64-Opthree))); 
    else 
    { 
    //  printf("%d",Opthree); 
        Opthree = 0 - Opthree; 
    //  printf("%d",Opthree); 
        Ans ^= (input >> Opthree); 
    } 
    return Ans; 

 
void Round() 

    unsigned long long A,B,C,D,E,F,G,I; 
    A = H[0]; 
    B = H[1]; 
    C = H[2]; 
    D = H[3]; 
    E = H[4]; 
    F = H[5]; 
    G = H[6]; 
    I = H[7]; 
     
    int index = 0; 
    unsigned long long t1 = 0, t2= 0, s0 = 0, s1 = 0; 
    for(index = 0;index < RoundNum ;index++) 
    { 
        s0 = 0; 
        s1 = 0; 
        s0 = ShiftNum3(A, 28, 34, 39); 
        t2 = s0 + ((A&B)^(A&C)^(B&C)); 
        s1 = ShiftNum3(E, 14, 18, 41); 
        t1 = I + s1 + ((E&F)^((~E)&G)) + K[index] + W[index]; 
         
        I = G; 
        G = F; 
        F = E; 
        E = D + t1; 
        D = C; 
        C = B; 
        B = A; 
        A = t1 + t2; 
#ifdef DEBUG 
    printf("ABCDE  %x %x %x %x %x \n",A,B,C,D,E); 
    system("pause"); 
#endif 
    } 
 
    H[0]+=A; 
    H[1]+=B; 
    H[2]+=C; 
    H[3]+=D; 
    H[4]+=E; 
    H[5]+=F; 
    H[6]+=G; 
    H[7]+=I; 

#include 
#include 
#include 
//#define DEBUG 1 
#define RoundNum 80 
#define BlockWidthNum 16 
#define ConstNum 8 
unsigned long long H[ConstNum] = { 
0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 
0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4}; 
unsigned long long K[RoundNum] = { 
0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,  
0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,  
0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,  
0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,  
0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,  
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,  
0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,  
0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,  
0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,  
0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,  
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,  
0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,  
0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,  
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,  
0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,  
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,  
0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,  
0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,  
0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,  
0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; 
 
unsigned long long M[BlockWidthNum]; 
unsigned long long W[RoundNum]; 
unsigned char LastString[BlockWidthNum*8*2]; 
FILE * fp; 
fpos_t pos; //文件长度 
int flag ;  
int LastRoundCount; 
 
int GetMessage(unsigned long long rLen); 
void SetW(); 
void Round(); 
unsigned long long ShiftNum3(unsigned long long input, int OpOne, int OpTwo, int Opthree); 
 
int main(int argc, char *argv[]) 

//  fp = fopen(argv[1],"rb"); 
    if(!(fp = fopen(argv[1],"rb"))) 
    { 
        exit(1); 
    } 
    clock_t start, finish;   
    start = clock();   
     
    fseek(fp, 0, SEEK_END); 
    fgetpos(fp, &pos); 
 
    unsigned long long realLen = pos;//暂时不支持hash超大文件 
 
    memset(LastString,0x00,strlen(LastString)*sizeof(unsigned char)); 
     
    int LastOut = realLen%(BlockWidthNum*8); 
    fseek(fp,-1*LastOut,SEEK_END); 
 
    int i; 
    fread(LastString,LastOut,1,fp); 
    LastString[LastOut] = 0x80;  
     
    LastRoundCount = 1; 
    flag = 0; 
//暂时不支持hash大小超过2^64的文件, 
//sha512更长了,这样更加安全了,但是也不一定要hash这种超大的文件 
    if( LastOut <= BlockWidthNum*8-1-16) 
    { 
        flag = 1; 
    //  memcpy(LastString+512/8-8,&copyLen,8); 
        for( i = 8; i >= 1; i--) 
            LastString[BlockWidthNum*8 - i] = (char)((realLen<<3)>>((i-1)*8));  
    } 
    else 
    { 
        flag = 2; 
    //  memcpy(LastString+512/8*2-8,&copyLen,8); 
        for( i = 1; i <= 8; i++) 
            LastString[BlockWidthNum*8*2 - i] = (char)((realLen<<3)>>((i-1)*8));  
    } 
 
    realLen -= LastOut; 
 
    fseek(fp,0,SEEK_SET); 
     
    while(GetMessage(realLen)) 
    { 
        SetW(); 
        Round(); 
    } 
     
    printf("SHA384:  "); 
    for(i = 0 ; i < 6; i++) 
        printf("6llx",H[i]); 
    printf("\n");  
     
    finish = clock();   
    double duration = (double)(finish - start) / CLOCKS_PER_SEC;  
    printf("Cal time: %f seconds\n",duration); 
    fclose(fp); 
    return 0; 

 
int GetMessage(unsigned long long rLen) 

    fgetpos(fp, &pos); 
 
    if(pos + 16 * 8 <= rLen ) 
    { 
        fread(M,8,16,fp); 
        return 1; 
    } 
    if(LastRoundCount <= flag) 
    { 
        memcpy(M,(LastString+BlockWidthNum*8*(LastRoundCount - 1)),BlockWidthNum*8);//最后的一段或是两段 
        LastRoundCount++; 
        return 1; 
    } 
    else 
        return 0; //false;   

void SetW() 

    int index = 0; 
//  memcpy(W,M,16*4); 
 
    for(index = 0; index <= 15;index++) 
    { 
        W[index] = (M[index]>>56)|(M[index]<<56)|((M[index]&0x00ff000000000000)>>40)|((M[index]&0x000000000000ff00)<<40) 
                    |((M[index]&0x0000ff0000000000)>>24)|((M[index]&0x0000000000ff0000)<<24)|((M[index]&0x000000ff00000000)>>8)|((M[index]&0x00000000ff000000)<<8); 
//      printf("6llx ",W[index]); 
    }  
    unsigned long long s0 = 0, s1 = 0; 
    for(index = 16; index < RoundNum; index++) 
    { 
        s0 = 0; 
        s1 = 0; 
        s0 = ShiftNum3(W[index-2],19,61,-6); 
        s1 = ShiftNum3(W[index-15],1,8,-7); 
        W[index] = (s0 + W[index-7] + s1 + W[index-16]); 
//      printf("6llx ",W[index]); 
    } 

 
unsigned long long ShiftNum3(unsigned long long input, int OpOne, int OpTwo, int Opthree) 

    unsigned long long Ans = 0 ;  
    Ans ^= ((input >> OpOne)|(input<<(64-OpOne))); 
    Ans ^= ((input >> OpTwo)|(input<<(64-OpTwo))); 
    if(Opthree > 0) 
        Ans ^= ((input >> Opthree)|(input<<(64-Opthree))); 
    else 
    { 
    //  printf("%d",Opthree); 
        Opthree = 0 - Opthree; 
    //  printf("%d",Opthree); 
        Ans ^= (input >> Opthree); 
    } 
    return Ans; 

 
void Round() 

    unsigned long long A,B,C,D,E,F,G,I; 
    A = H[0]; 
    B = H[1]; 
    C = H[2]; 
    D = H[3]; 
    E = H[4]; 
    F = H[5]; 
    G = H[6]; 
    I = H[7]; 
     
    int index = 0; 
    unsigned long long t1 = 0, t2= 0, s0 = 0, s1 = 0; 
    for(index = 0;index < RoundNum ;index++) 
    { 
        s0 = 0; 
        s1 = 0; 
        s0 = ShiftNum3(A, 28, 34, 39); 
        t2 = s0 + ((A&B)^(A&C)^(B&C)); 
        s1 = ShiftNum3(E, 14, 18, 41); 
        t1 = I + s1 + ((E&F)^((~E)&G)) + K[index] + W[index]; 
         
        I = G; 
        G = F; 
        F = E; 
        E = D + t1; 
        D = C; 
        C = B; 
        B = A; 
        A = t1 + t2; 
#ifdef DEBUG 
    printf("ABCDE  %x %x %x %x %x \n",A,B,C,D,E); 
    system("pause"); 
#endif 
    } 
 
    H[0]+=A; 
    H[1]+=B; 
    H[2]+=C; 
    H[3]+=D; 
    H[4]+=E; 
    H[5]+=F; 
    H[6]+=G; 
    H[7]+=I; 
}

hash 算法 (转)相关推荐

  1. 一致性 hash 算法( consistent hashing )

    原文地址:http://blog.csdn.net/sparkliang/article/details/5279393 consistent hashing 算法早在 1997 年就在论文 Cons ...

  2. 区块链笔记-Hash算法

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链笔记-Hash算法 区块链技术是一系列技术的结合,建立新的技术架构,hash算法是很重要的一块,如果理解不当的地方 ...

  3. 区块链概念:Hash 算法

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 区块链概念1:Hash 算法 作用在学习哈希算法前,我们需要知道哈希在区块链的作用哈希算法的作用如下:区块链通过 ...

  4. 一致性 Hash 算法的实际应用

    前言 记得一年前分享过一篇<一致性 Hash 算法分析>,当时只是分析了这个算法的实现原理.解决了什么问题等. 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的 ...

  5. 不会一致性hash算法,劝你简历别写搞过负载均衡

    这两天看到技术群里,有小伙伴在讨论一致性hash算法的问题,正愁没啥写的题目就来了,那就简单介绍下它的原理.下边我们以分布式缓存中经典场景举例,面试中也是经常提及的一些话题,看看什么是一致性hash算 ...

  6. 用人话理解hash算法、特性、唯一性等

    背景 博主在本科的时候曾经参加过数学建模,当初提交参赛论文的时候有两个提交时间点,第一个是提交MD5码的时间,第二个是提交具体参赛论文的时间,当初就很纳闷,直接提交论文不就ok吗?为什么多此一举呢 我 ...

  7. 什么是一致性 Hash 算法

    数据分片 先让我们看一个例子吧 我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力. 当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了: ...

  8. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  9. 一致性Hash算法(KetamaHash)的c#实现

    Consistent Hashing最大限度地抑制了hash键的重新分布.另外要取得比较好的负载均衡的效果,往往在服务器数量比较少的时候需要增加虚拟节点来保证服务器能均匀的分布在圆环上.因为使用一般的 ...

  10. MurmurHash算法:高运算性能,低碰撞率的hash算法

    MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...

最新文章

  1. 医工结合之路:草木蔓发,春山可望 | 专访清华统计中心俞声
  2. appium简明教程(7)——Desired Capabilities详解
  3. 面向 CPython GIL 的多线程编程要点
  4. 【PAT乙级】1077 互评成绩计算 (20 分)
  5. 使用Puppeteer进行数据抓取(一)——安装和使用
  6. 工作292:修改父子组件传值错误
  7. Vivado使用ILA调试报错解决
  8. Android Studio中Eric常用的快捷键
  9. windows下重设mysql的root密码
  10. andriod 获取attrs_Android:具有attrs.xml中对象引用的Custom View,...
  11. oppo9.0系统手机一键激活Xposed框架的步骤
  12. 一文带你斩杀Python之Numpy☀️Pandas全部操作【全网最详细】❗❗❗
  13. Jmeter安装及使用教程
  14. 从多个文档在Word 2010中创建主文档
  15. 点击自定义按钮弹出百度商桥对话框
  16. 学而思王帆初中语文教学视频
  17. java8 成绩分数排名
  18. 夏季养生要以“清”为贵
  19. 微信域名防红是怎么做出来的,原理是什么?_域名微信防封
  20. Notepad++常用插件下载地址

热门文章

  1. 通过javascript免费下载百度文库的文档的小技巧
  2. MAC电脑迁移本机Notes
  3. [个人学习]透视画法的一点记录
  4. 我的朋友栅栏的进阶_油漆栅栏,砍伐的木材,拉杂草,植物树-在我的舒适区之外找到极客平衡...
  5. 口语对话 谈判的基本技巧
  6. 【转载】Android App应用启动分析与优化
  7. App逆向学习--1
  8. 神经网络实现手写数字识别
  9. python官网-python中文官网
  10. mysql计算结果取整_Sql 获取向上取整、向下取整、四舍五入取整的实例(转)