2012-02-25 9 views
8

ファイルのアップロードジョブを実行しています。私はSHA256とCRC32ハッシュを生成したい。誰も私がそれらのハッシュを生成する方法私を助けることができますか?私はそれをiOSのために働かせたい。iosでSHA256とCRC32を生成する方法

+2

グーグルで試しましたか? – Dani

+0

@ダニそうでした。 – NSCry

答えて

32

ためSHA256がCommonCryptoで提供されています....動作するはずです。 CRC32はハッシュではなく、巡回冗長検査です。

例コード:

#import <CommonCrypto/CommonDigest.h> 

NSData *dataIn = [@"Now is the time for all good computers to come to the aid of their masters." dataUsingEncoding:NSASCIIStringEncoding]; 
NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; 

CC_SHA256(dataIn.bytes, dataIn.length, macOut.mutableBytes); 

NSLog(@"dataIn: %@", dataIn); 
NSLog(@"macOut: %@", macOut); 

のNSLog出力:
ストリームdataIn:< 4e6f7720 69732074 68652074 696d6520 666f7220 616c6c20 676f6f64 20636f6d 70757465 72732074 6f20636f 6d652074 6f207468 65206169 64206f66 20746865 6972206d 61737465 72732e>

macOut:< 53f89cf6 7ebfbe56 89f1f76a 3843dfd1 09d68c5b a938dcd2 9a12004e 108260cb>

+0

ok.But私は任意のdata.Areそこにそれを取得する方法はCRC32値を取得したいですか? – NSCry

+0

私はiosのために動かしたいと思っています。私は、CommonCrypto/CommonDigest.hを秘密のフレームワークで見つけられません。 – NSCry

+0

Appleは変身していますが、iOS 5.0 SDKでこれをテストしました。 crc32は、zlibなどのいくつかのライブラリで利用できます。 – zaph

-4

iOS用のハッシュを生成することができます何のアプリが存在しない

これは、マック

http://itunes.apple.com/us/app/digiprint/id473233587?mt=12

+5

Yagneshにはうってつけの試みですが、元のポスターは自分のプログラムでSHA256とCRC32の数字をプログラムでアップロードする方法を尋ねています。 –

+0

@MichaelDautermannはいそうです。あなたには何か提案がありますか? – NSCry

+0

あなたはこの関連する質問/回答に役立つヒントを得るかもしれません(http://stackoverflow.com/questions/1847281/commoncrypto-is-no-longer-part-of-the-iphone-sdk-where-else -can-i-get-a-a)、@ARC。 –

1

これらの両方について、

https://gist.github.com/paul-delange/6808278

および実施例

NSString* crc32 = (__bridge NSString*)TGDFileHashCreateWithPath((__bridge CFStringRef)filepath, TGDFileHashDefaultChunkSizeForReadingData, TGDChecksumAlgorithmCRC32); 
+0

素敵です。ありがとうございました。 – Drakes

0

ファイルパスからiOSでのgcloudで使用されるCRC32Cを生成するこの方法Nこの要旨を使います。標準のcrc32でCRC32_POLYNOMIALの他の値のコメントを外したい場合は、

これは512KBのチャンクで指定されたファイルを読み取ります。したがって、大きなファイルで使用できます。

- (NSString*) crc32c:(NSString*)filepath{ 

    /// using crc code from 
    // http://classroomm.com/objective-c/index.php?action=printpage;topic=2891.0 
    // by rgronlie 


    //this is the standard crc32 polynomial 
    //uint32_t CRC32_POLYNOMIAL = 0xEDB88320; 

    //this is the crc32c one 
    uint32_t CRC32_POLYNOMIAL = 0x82F63B78L; 
    uint32_t CRC32C_SEED = 0xFFFFFFFFL; 

    // create and populate a lookup table 
    uint32_t* pCRCTable = malloc(sizeof(uint32_t) * 256); 

    for (uint32_t i = 0; i <= 255; i++) 
    { 
     uint32_t crc32 = i; 
     for (uint32_t j = 8; j > 0; j--) 
     { 
      if ((crc32 & 1) == 1) 
       crc32 = (crc32 >> 1)^CRC32_POLYNOMIAL; 
      else 
       crc32 >>= 1; 
     } 
     pCRCTable[i] = crc32; 
    } 

    // get a handle to the file 
    NSFileHandle *filehandle = [NSFileHandle fileHandleForReadingAtPath:filepath]; 

    if(filehandle == NULL){ 
     NSLog(@"failed to create file handle"); 
     return nil; 
    } 

    // a buffer to read into 
    NSData* databuffer; 

    uint32_t crc = CRC32C_SEED; 

    // read the file in chunks of 512KB 

    while(true){ 
     databuffer = [filehandle readDataOfLength: 512 * 1024]; 

     // if there is nothing left finish 
     if([databuffer length] == 0){ 
      break; 
     } 
     // otherwise run each chunk through the lookup table 
     uint8_t *pBytes = (uint8_t *)[databuffer bytes]; 
     uint32_t length = [databuffer length]; 

     while (length--) 
     { 
      crc = (crc>>8)^pCRCTable[(crc & 0xFF)^*pBytes++]; 
     } 
    } 

    // clean up 
    [filehandle closeFile]; 
    free(pCRCTable); 

    // this is the result 
    uint32_t hash = crc^0xFFFFFFFFL; 

    // reverse it for endianness 
    uint32_t hash_reversed = CFSwapInt32HostToBig(hash); 
    // as raw bytes 
    NSData* hash_data = [NSData dataWithBytes: &hash_reversed length: sizeof(hash_reversed)]; 
    // return base64 encoded 
    return [hash_data base64EncodedStringWithOptions:0]; 
} 
関連する問題