4

一意のキー名と特定のクライアントのプリセットを持つユーザー列ファミリーがあるとしましょう

<?php 
uniqid ("serverA");//generate something like; serverA4b3403665fea6
?>

セカンダリ インデックスなどで選択できます: (phpcassa の誕生日の例)

$column_family = new ColumnFamily($conn, 'Indexed1');
$index_exp = CassandraUtil::create_index_expression('birthdate', 1984);
$index_clause = CassandraUtil::create_index_clause(array($index_exp));
$rows = $column_family->get_indexed_slices($index_clause);
// returns an Iterator over:
//    array('winston smith' => array('birthdate' => 1984))

foreach($rows as $key => $columns) {
    // Do stuff with $key and $columns
    Print_r($columns)
}

ただし、ページごとに30人の最新の追加ユーザー(作成されたキー)とマルチページレイアウトを持つクエリのみが必要で、すべてのページに古いキーが表示されます

私が現在見つけた唯一のオプションは、phpcassaのuuidを使用することです

uuid1()現在の時刻とマシンの MAC アドレスに基づいて UUID を生成します。

  • 長所: UUID を作成時刻で並べ替えたい場合に便利です。
  • 短所: どのコンピューターでいつ生成されたかが明らかになるため、プライバシーが漏洩する可能性があります。
  • 衝突の可能性: 同じマシンで 2 つの UUID がまったく同時に (100 ns 以内に) 生成された場合。(または、他のいくつかのありそうもない限界的なケース。)

uuid2()もう使わないようです。

uuid3()いくつかの名前空間 (URL、ドメイン名など) 内で選択した任意の名前の MD5 ハッシュを取得して UUID を生成します。

  • 長所: UUID のブロックを異なる名前空間に割り当てる優れた方法を提供します。名前からUUIDを再現しやすい。
  • 短所: すでに一意の名前を持っている場合、なぜ UUID が必要なのですか?
  • 衝突の可能性: 名前空間内で名前を再利用する場合、またはハッシュの衝突がある場合。

uuid4()完全にランダムな UUID を生成します。

  • 長所: プライバシーの心配はありません。一意の名前を生成する必要はありません。
  • 短所: UUID への構造がありません。
  • 衝突の可能性: 不適切な乱数ジェネレーターを使用した場合、ランダム シードを再利用した場合、または非常に運が悪かった場合。

uuid5()uuid3()MD5 の代わりに SHA-1 ハッシュを使用する点を除いて、 と同じです。よりも正式に優先されuuid3()ます。

しかし、それは私がいくつかの部分を書き直さなければならないことを意味します+衝突の可能性を得る.

私が思いもよらなかった賢いハックはありますか?

4

1 に答える 1

3

まず、UUID に関しては、uuid1() または uuid4() のいずれかを使用することを計画している場合は、衝突について心配する必要はありません (実際に使用されるのはこれらだけです)。そのようなイベントの確率は天文学的に低いです。ご心配なく。

最近追加された 30 個のキーを (ページング機能と共に) 取得するためには、実際には時系列データについて話していることになります。これは Cassandra を使用した時系列の優れた紹介です。タイムスタンプまたは v1 UUID を列名として使用し、一意のキーを列値として使用できます。一意のキーに v1 UUID を使用することを選択した場合は、それらを列名に直接入れることができます。その時点では、Cassandra で通常の時系列データとページングを処理しているだけです。

于 2011-11-24T04:03:52.560 に答える