0

我正在尝试为 coreData 中的对象创建指纹,并希望将其设置为对象的属性。我认为 CFBitArray 是要走的路。

我试图弄清楚如何保存每个对象:

这是一个例子

目的

属性:名称:指纹(“01010101010101010101010110”)等...

这用于尝试与主打印匹配

有什么建议么?

4

2 回答 2

1

您必须将其转换为 Core Data 理解的内容,并保存转换后的值。有几种可能性,这两种可能性都涉及通过CFBitVectorGetBits. 一旦你有了它,你可以

  • 将它们保存在NSDatausing中+dataWithBytes:length:,然后将其放入托管对象的二进制类型属性中。或者...
  • 根据您使用的字节数,将它们保存在NSNumberusing 之类的东西中+numberWithLong:(或者任何长度足以容纳位数的东西)。然后将其放入 Core Data 的整数类型之一中——再次选择适合您的位的任何大小。

您可以通过在NSManagedObject子类上使用自定义访问器方法或使用可转换的Core Data 属性类型和值转换器类来进行转换。对于后者,您将NSValueTransformer在那里继承并实现您的转换(Apple 提供了几个示例)。

根据您实际在做什么,您可能需要考虑使用NSIndexSet而不是CFBitVectorRef. 如果没有别的,它符合NSCoding-- 这意味着您可以使用可转换的属性,但依赖 Core Data 的默认值转换器,而不是自己编写。

您可能还会发现仅使用其中一种整数类型并依靠位运算符来确定是否设置了位要简单得多。然后你不需要对 Core Data 做任何特别的事情,你只需选择适当大小的整数类型。

于 2013-02-11T18:42:07.873 回答
0

你为什么不只是存储NSDataNSData在内部存储二进制数据比在内部存储更容易CFBitvectorRef

如果您尝试存储某物的哈希/指纹,我假设您正在使用,和创建SHA-256哈希。这些会给你一个所谓的摘要,它是你传递到.CC_SHA256_Init_Update_FinalCC_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)];

然后,您可以将该指纹存储到 Core Data 属性中,即Binary Data

根据 的类型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]);
于 2013-02-12T20:06:56.133 回答