gpt4 book ai didi

objective-c - 来自同一文件的不同 md5 总和

转载 作者:行者123 更新时间:2023-12-03 22:03:41 25 4
gpt4 key购买 nike

我正在从 iphone 画廊的视频文件中计算 md5 总和。每次我选择相同的文件时,它都有不同的 md5 总和。我还检查以字节为单位的数据长度,它保持不变。所以我的问题是 - 为什么?这是一些代码,其中包含我尝试制作的多种方式。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.movie"])
{
NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
videoData = [NSData dataWithContentsOfURL:videoURL];
[videoData retain];
NSLog(@"VIDEO DATA MD5: %@", [videoData md5]);
NSLog(@"VIDEO DATA LEN: %d", videoData.length);
}

[self dismissModalViewControllerAnimated:YES];
}

Implementation of MD5 Method :
#import <CommonCrypto/CommonDigest.h>

@implementation NSData(MD5)

- (NSString*)MD5
{
// Create byte array of unsigned chars
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];

// Create 16 byte MD5 hash value, store in buffer
CC_MD5(self.bytes, self.length, md5Buffer);

// Convert unsigned char buffer to NSString of hex values
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x",md5Buffer[i]];

return output;
}

@end

最佳答案

我可以确认这种行为。无论选择何种散列函数,它都会发生(我尝试了 MD5、SHA1 和 SHA256)。
问题似乎是 NSData .我创建了两个 NSData来自 的实例完全相同的文件 然后使用 [data1 isEqualTo:data2]并且返回true。但是,通过 CC_SHA1 运行这些散列算法为每个返回不同的散列。
要解决此问题,请删除 NSData .而是使用较低级别的 C API 打开文件。这是一个 C 语言的例子。注意“创建”约定——你负责释放返回的 char*完成后缓冲。使用这种方法每次都会产生相同的哈希值。

char* _Nullable createBufferWithContentsOfFileAndReportLength(NSString* _Nonnull fileToScan, long* _Nullable length)
{
char const *pathToFile = [fileToScan cStringUsingEncoding:NSUTF8StringEncoding];

FILE *file = fopen(pathToFile, "r");
if (file == NULL) {
NSLog(@"Unable to open file: %@", fileToScan);
return NULL;
}

//
// Get the file length.
// 'fileLength' will be the number of bytes in the file. It will not include a null terminator or EOF. Some UTF8 characters require more than one byte, so we
// can't guarantee that fileLength is also the number of characters.
// NOTE: We don't use the fseek()/ftell()/rewind approach because it's not secure. See CERT FIO19-C advisory for details.
//
int fd = fileno(file);
if (fd < 0) {
NSLog(@"Unable to get a file descriptor for: %@", fileToScan);
fclose(file);
return NULL;
}
struct stat statBuffer;
if (fstat(fd, &statBuffer) == -1) {
NSLog(@"Unable to retrieve stats about this file: %@", fileToScan);
fclose(file);
return NULL;
}
long fileLength = statBuffer.st_size;

char *buffer = malloc(sizeof(char) * (fileLength + 1)); // enough memory to read the entire file, plus a spot for the null terminator
if (buffer == NULL) {
NSLog(@"Unable to allocate memory for: %@", fileToScan);
fclose(file);
return NULL;
}

fread(buffer, fileLength, sizeof(char), file);
buffer[fileLength] = '\0'; // No +1; this is zero-indexed. If fileLength is 5 characters, the 5th slot in the array needs to be the null terminator.
fclose(file);

if (length != NULL) {
*length = fileLength + 1;
}

return buffer;
}

关于objective-c - 来自同一文件的不同 md5 总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com