1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ファイルのSHA-256ハッシュ値を計算する

Last updated at Posted at 2019-04-12

ファイルのSHA-256ハッシュ値を計算する

背景

とある2つのファイルがあった場合に、同一性を確認したい場合があります。
そのときにそれぞれのファイルのハッシュ値を計算して比較する方法が一般的な手法の1つにあります。

SHA-256とはハッシュ値の計算アルゴリズムの1つです。collision(偶然の値の一致)が起きるは非常に低く、collisionが起きる前に地球が滅びるらしいので、ファイルの同一性を見るには信用できるものである。

参考

実装

SHA-256の計算のところで下記のインポートが必要です。

# import <CommonCrypto/CommonHMAC.h>

実際にSHA-256を計算する関数は下記の通り。

/**
 @brief ファイルのSHA-256ハッシュ値を計算する
 @param file 対象ファイルパス
 @return ハッシュ値の文字列
 */
- (NSString *)calculateSha256HashWithFilePath:(NSString *)file {
    
    NSData *fileData = [NSData dataWithContentsOfFile:file];
    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0};
    CC_SHA256(fileData.bytes, (int)fileData.length, digest);
    NSData *hashData = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    
    NSString *hash = [[NSString alloc] initWithString: hashData.debugDescription];
    
    NSLog(@"🐱 hashData.description: %@", hashData.description);
    NSLog(@"🐱 hashData.debugDescription: %@", hashData.debugDescription);
    
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
    
    return hash;
}
  • 出力例
# 10.15.4(19E287)
デフォルト	12:55:19.316584+0900	Fontinstaller	🐱 hashData.description: {length = 32, bytes = 0x45f62b0e 67be6057 4fc399aa c45234cb ... cc0877d1 d69dadde }
デフォルト	12:55:19.316634+0900	Fontinstaller	🐱 hashData.debugDescription: <45f62b0e 67be6057 4fc399aa c45234cb 38e61c8d 851f7fda cc0877d1 d69dadde>

# 10.14.4 Beta(18E194d)
デフォルト	13:09:56.653950 +0900	Fontinstaller	🐱 hashData.description: <45f62b0e 67be6057 4fc399aa c45234cb 38e61c8d 851f7fda cc0877d1 d69dadde>
デフォルト	13:09:56.654052 +0900	Fontinstaller	🐱 hashData.debugDescription: <45f62b0e 67be6057 4fc399aa c45234cb 38e61c8d 851f7fda cc0877d1 d69dadde>

# 10.12.6(16G1212)
デフォルト	13:00:03.831566 +0900	Fontinstaller	🐱 hashData.description: <45f62b0e 67be6057 4fc399aa c45234cb 38e61c8d 851f7fda cc0877d1 d69dadde>
デフォルト	13:00:03.831693 +0900	Fontinstaller	🐱 hashData.debugDescription: <45f62b0e 67be6057 4fc399aa c45234cb 38e61c8d 851f7fda cc0877d1 d69dadde>

呼び出し方の例。

呼び出し部分
NSString *kSampleFile = [@"~/Desktop/sample.txt" stringByExpandingTildeInPath]; // デスクトップにえテスト用のファイルを作成
NSURL    *file        = [NSURL fileURLWithPath:kSampleFile];
NSString *hash        = [self calculateSha256HashWithFileUrl:file];
NSLog(@"計算したハッシュ値:%@", hash);

結果とターミナルでハッシュ値の計算

プログラムの結果例は下記の通り。

計算したハッシュ値:adf0380c6469682dc23b63597267d1ee63595813b2f46ba72477109fcbecbceb

ターミナルでもハッシュ値の計算ができる。
上記の結果と一致していることが確認できる。

ターミナルでSHA-256の計算
shasum -a 256 sample.txt 
adf0380c6469682dc23b63597267d1ee63595813b2f46ba72477109fcbecbceb  sample.txt
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?