0

2 つの double コンポーネントと小数点以下 3 桁までの精度を持つベクトル クラスがあり、これは 1 秒あたり 10 億回のようにインスタンス化されます。
私はそれらの長さを何度も計算します。
今、長さをメモリに保存したいのですが、HashMap/辞書のようなものが良い考えだと思いましたが、それはキーが必要であることを意味します。だから私は考えました:ベクトルコンポーネントを使用しないのはなぜですか。私は 2 つのキーを持つことができないので、これらの 2 つの数値を一緒にスローして (順序は明らかに重要ではありません)、一意の結果を得る方法を探しています。

私の友人は MD5 を使用することを提案しましたが、私はそれはやり過ぎかもしれないと思いました (MD5 についてそれを言うとは思いもしませんでした)。

4

3 に答える 3

2

おっしゃるとおり、md5 はやり過ぎ感があります。単純なハッシュ関数がたくさんあります。たとえば、XOR ハッシュは低レベルのものに一般的です。

unsigned xor_hash ( void *key, int len )
{
    unsigned char *p = key;
    unsigned h = 0;
    int i;

    for ( i = 0; i < len; i++ )
        h ^= p[i];

    return h;
}

ただし、パフォーマンスが重要な場合は、データの種類に適したチェックサムを検索する必要があります。黄金の答えはありません。

ここには多くの代替手段があり、それらはすべて実装とテストが非常に簡単です。チェックサムの長さを試して、長いチェックサムがアプリケーションの他の部分にどの程度影響するかを確認することもできます (パフォーマンスに関して)。

于 2013-06-18T10:20:33.830 に答える
2

単純に 2 つの値を連結しますか? 128 ビット キーを使用すると、最初の 64 ビットが最初の double、2 番目の 64 ビットが 2 番目の double になりますか?

使用している言語によっては、オブジェクト/構造体などをキーとして使用することもできます。

ただし、メモリ使用量は膨大になります。

于 2013-06-18T08:40:19.490 に答える
1

少し「力ずく」ですが、文字列表現を連結するのはどうですか? 数値を小数点以下 3 桁に強制すると、12.23 と 100.1 は 12.230100.100 になります。

唯一の欠点は、文字列への変換に時間がかかることです。DThoughts の double 値の連結の提案以上のものだと思います。それをテストできます。

于 2013-06-18T10:33:28.640 に答える