1

データベースに持ち込まれる C++ プログラムに読み込まれたドキュメントの一意の ID が必要です。ID が関連付けられているドキュメントが最初にプログラムを介して実行されるか、単独で実行されるか、または他のドキュメントのスタックの途中で実行されるかに関係なく、ID は同じである必要があります。データベース内のドキュメントの上書きを尊重できるように。

などのドキュメント名のASCII値を使用することを検討しました

従業員仕様ページ.doc 358

しかし、それは同じ値を持っています

Warnings.doc 358 への回答

つまり、プログラムで 2 番目のドキュメントを実行すると、最初のドキュメントの存在が上書きされます。

ID は数値で一意である必要がありますが、データベース自体を相互参照することなく一貫して再生成可能である必要があります (このプログラムはデータベース インポート プログラムとは別に実行されるため)。

私は困惑しているので、誰かがいくつかのアイデアを持っていることを願っています。

編集: MD5 を使用して「Employee Spec Page.doc」と「Answer Warnings.doc」を変換しようとしたところ、次の文字表現が得られました。

警告への回答: 2dcb2503c48f5472bfdbafe28d565a9d
従業員仕様ページ: a9be4c1428c11b406072c0bd3dab2dee

ただし、次に char* を unsigned int に変換すると

char* docID = md5.digestString(pDocument->m_csDocumentName.GetBuffer());
pDocument->m_csDocID.Format("%i",(unsigned int)docID);

私は両方を取得します:

警告への回答: 1634456
従業員仕様ページ: 1634456

ここから md5 クラスを取得しました: http://bobobobo.wordpress.com/2010/10/17/md5-c-implementation/

私は何を間違っていますか?整数にする必要があります。そうしないと、ID をデータベースに保存できません。

4

2 に答える 2

3

必要なのは、衝突を避けるのに十分な大きさの数値を生成するハッシュ関数です。MD5 (上記の piokuc のように) は問題ないはずです

MD5 の結果を切り捨てるだけで、より短いキーを生成できます。ただし、衝突の可能性が高くなることに注意してください。128 ビットには 10^38 以上の異なるキーがあります。64 ビットには 10^19 以上あります。32 ビットは 10^9 (4.294.967.296) を超えています。したがって、32 ビットは、2 つの特定のドキュメント間で衝突が発生する宝くじのチャンスに近いです。10.000 ドキュメントの場合、1% の確率で少なくとも 1 つの競合が発生します。特定の鍵の長さを受け入れるかどうかは、要件によって異なります。もちろん、衝突検出と衝突解決を実装できます。

「データベース」で短いキーしか許可されていない場合は、衝突解決を実装する必要があります。その方法については、 Hash_table Collision_resolutionを参照してください。

ウィキペディアから: '10^−18 から 10^−15 は、典型的なハードディスクの訂正不能なビット エラー率です。理論的には、128 ビットの MD5 ハッシュまたは UUID は、約 8,200 億のドキュメントまでその範囲内にとどまる必要があります。


具体的なライブラリに:

md5ヘッダーファイルを調べると、

public:
    // an MD5 digest is a 16-byte number (32 hex digits)
    BYTE digestRaw[ 16 ] ;

いつでもバイナリ ダイジェストを取得できます

MD5 md5;
char* docID = md5.digestString(pDocument->m_csDocumentName.GetBuffer());
unsigned int hash_ui = *(unsigned int *)digestRaw;

于 2012-12-01T17:52:24.777 に答える
2

ID の生成には md5 アルゴリズムを使用できます。無料の実装を簡単に見つけることができます。

于 2012-12-01T17:45:25.413 に答える