0

coreData でオブジェクトのフィンガープリントを作成しようとしていますが、それをオブジェクトの属性として設定したいと考えています。私は CFBitArray が行くべき道だと考えました。

オブジェクトごとにこれを保存する方法を見つけようとしています:

ここに例があります

物体

属性: 名前: 指紋 ("01010101010101010101010110") など...

これは、マスタープリントとの一致を試みるために使用されます

助言がありますか?

4

2 に答える 2

1

Core Dataが理解できるものとの間で変換し、変換された値を保存する必要があります。いくつかの可能性があり、どちらもを介して実際のビットを取得する必要がありますCFBitVectorGetBits。あなたがそれを持ったら、あなたはすることができます

  • NSDataのようなものを使用してそれらを保存し、それ+dataWithBytes:length:を管理対象オブジェクトのバイナリタイプ属性に配置します。または...
  • 使用しているバイト数に応じて、 (またはビット数に十分な長さの)のNSNumberようなものを使用してそれらを保存します。+numberWithLong:次に、それをCore Dataの整数型の1つに入れます。ここでも、ビットに合うサイズを選択します。

NSManagedObjectサブクラスでカスタムアクセサメソッドを使用するか、変換可能なCoreData属性タイプと値トランスフォーマークラスを使用して変換を行うことができます。後者の場合、そこで変換をサブクラスNSValueTransformer化して実装します(Appleはこの例をいくつか提供しています)。

実際に行っていることによっては、NSIndexSetの代わりに使用することを検討することをお勧めしますCFBitVectorRef。他に何もない場合は、NSCoding-に準拠します。つまり、変換可能な属性を使用できますが、独自の属性を作成する代わりに、CoreDataのデフォルト値のトランスフォーマーに依存します。

また、整数型の1つを使用し、ビット単位の演算子を使用してビットが設定されているかどうかを判断する方がはるかに簡単な場合もあります。そうすれば、Core Dataで特別なことをする必要はなく、適切なサイズの整数型を選択するだけです。

于 2013-02-11T18:42:07.873 に答える
0

なぜあなたはただ保管していないのNSDataですか?NSDataバイナリ データを内部に格納するよりも、内部に格納する方がはるかに簡単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)];

次に、そのフィンガープリントをBinary Dataである Core 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 に答える