らいふログ

日々のメモ

Objective-Cでsha1

http://d.hatena.ne.jp/WaterFlea/20091011/1255242225 を参考にさせてもらい、NSStringを拡張して、実装。

NSData+Hash.h

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>

@interface NSData (Hash)
+ (NSData *)utf8Data: (NSString *)string;
- (NSData *)sha1Digest;
- (NSString *)hexString;
- (NSString *)sha1String;
@end

NSData+Hash.m

※ No-ARC

#import "NSData+Hash.h"

@implementation NSData (Hash)

+ (NSData *)utf8Data:(NSString *)string {
  const char *utf8str = [string UTF8String];
  NSData *data = [NSData dataWithBytes:utf8str length:strlen(utf8str)];
  return data;
}

- (NSData *)sha1Digest {
  unsigned char result[CC_SHA1_DIGEST_LENGTH];
  CC_SHA1([self bytes], [self length], result);
  return [NSData dataWithBytes:result length:CC_SHA1_DIGEST_LENGTH];
}

- (NSString *)sha1String {
  return [[self sha1Digest] hexString];
}

- (NSString *)hexString {
  unsigned int i;
  static const char *hexstr[16] = { "0", "1", "2", "3",
    "4", "5", "6", "7",
    "8", "9", "a", "b",
    "c", "d", "e", "f" };
  const char *dataBuffer = (char *)[self bytes];
  NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:([self length] * 2)];
  for (i=0; i<[self length]; i++) {
    uint8_t t1, t2;
    t1 = (0x00f0 & (dataBuffer[i])) >> 4;
    t2 =  0x000f & (dataBuffer[i]);
    [stringBuffer appendFormat:@"%s", hexstr[t1]];
    [stringBuffer appendFormat:@"%s", hexstr[t2]];
  }
  
  return [[stringBuffer copy] autorelease];
}

@end

NSString+Hash.h

#import <Foundation/Foundation.h>

@interface NSString (Hash)
- (NSString *)sha1String;
@end

NSString+Hash.m

#import "NSString+Hash.h"
#import "NSData+Hash.h"

@implementation NSString (Hash)

- (NSString *)sha1String {
  return [[NSData utf8Data:self] sha1String];
}

@end

main.m

#import <Foundation/Foundation.h>
#import "NSData+Hash.h"
#import "NSString+Hash.h"

int main (int argc, const char * argv[]) {
  @autoreleasepool {
    NSLog(@"%@", [[NSData utf8Data: @"test"] sha1String]);
    NSLog(@"%@", [@"test" sha1String]);
    return 0;
  }
}