【发布时间】:2013-02-11 18:09:53
【问题描述】:
我正在尝试为 coreData 中的对象创建指纹,并希望将其设置为对象的属性。我认为 CFBitArray 是要走的路。
我正在尝试弄清楚如何保存每个对象:
这是一个例子
对象
属性: 姓名: 指纹(“01010101010101010101010110”)等...
这用于尝试与主打印匹配
有什么建议吗?
【问题讨论】:
标签: core-data nsmanagedobject cfbitvector
我正在尝试为 coreData 中的对象创建指纹,并希望将其设置为对象的属性。我认为 CFBitArray 是要走的路。
我正在尝试弄清楚如何保存每个对象:
这是一个例子
对象
属性: 姓名: 指纹(“01010101010101010101010110”)等...
这用于尝试与主打印匹配
有什么建议吗?
【问题讨论】:
标签: core-data nsmanagedobject cfbitvector
您必须将其与 Core Data 理解的内容进行转换,并保存转换后的值。有几种可能性,这两种可能性都涉及通过CFBitVectorGetBits 获取实际位。一旦你有了它,你就可以
+dataWithBytes:length: 之类的东西将它们保存在NSData 中,并将其放入托管对象的二进制类型属性中。或者...NSNumber 中,使用+numberWithLong: 之类的内容(或对于位数而言足够长的内容)。然后将其放入 Core Data 的一种整数类型中——同样,选择适合您的位的任何大小。您可以通过使用NSManagedObject 子类上的自定义访问器方法或使用可转换 核心数据属性类型和值转换器类来进行转换。对于后者,你可以继承 NSValueTransformer 并在那里实现你的转换(Apple 提供了几个例子)。
根据您的实际操作,您可能需要考虑使用NSIndexSet 而不是CFBitVectorRef。如果不出意外,它符合NSCoding-- 这意味着您可以使用可转换属性但依赖 Core Data 的默认值转换器而不是自己编写。
您可能还会发现只使用其中一种整数类型并依靠位运算符来确定是否设置了位要简单得多。然后你不需要对 Core Data 做任何特殊的事情,你只需选择适当大小的整数类型。
【讨论】:
为什么不只存储NSData?在NSData 中存储二进制数据比在CFBitvectorRef 中存储二进制数据要容易得多。
如果您尝试存储某物的 散列 / 指纹,我假设您正在创建一个 SHA-256 散列CC_SHA256_Init、_Update 和 _Final。这些会给你一个所谓的摘要,它是你传递到CC_SHA256_Update 的数据的指纹。
// Create the context:
CC_SHA256_CTX shaContext;
CC_SHA256_Init(&shaContext);
// For each value:
CC_SHA256_Update(&shaContext, &v, sizeof(v));
// Get the fingerprint / digest:
unsigned char digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256_Final(digest, &shaContext);
NSData *fingerprint = [NSData dataWithBytes:digest length:sizeof(digest)];
然后您可以将该 指纹 存储到一个核心数据属性中,即 二进制数据。
根据v 的类型,您可能必须将调用更改为CC_SHA256_Update()。如果您在 NSObject 上执行此操作,则需要为您感兴趣的每个实例变量调用它(这应该是指纹的一部分),例如如果你有
@property (nonatomic) int32_t count;
@property (nonatomic, copy) NSString *name;
你会的
int32_t v = self.count
CC_SHA256_Update(&shaContext, &v, sizeof(v));
NSData *d = [self.name dataUsingEncoding:NSUTF8Stringencoding];
CC_SHA256_Update(&shaContext, [data bytes], [data length]);
【讨论】: