ascii — c ++ нужен уникальный идентификатор для строки, но всегда одинаковый независимо от порядка

Мне нужен уникальный идентификатор для документа, прочитанного в программе на С ++, который будет перенесен в базу данных. Идентификатор должен быть одинаковым независимо от того, выполняется ли документ, к которому он привязан, сначала через программу, сам по себе или в середине пакета других документов. Так что я могу почитать перезаписи документа в базе данных.

Я подумал об использовании значения ASCII имени документа, такого как

Сотрудник Spec Page.doc 358

но оно имеет то же значение, что и

Ответ Warnings.doc 358

Это означает, что когда я запускаю второй документ в своей программе, он перезаписывает наличие первого документа.

Идентификатор должен быть числом и должен быть уникальным, но он должен постоянно восстанавливаться без перекрестных ссылок на саму базу данных (так как эта программа запускается отдельно от программы импорта базы данных)

Надеюсь, у кого-то есть идеи, потому что я в тупике.

РЕДАКТИРОВАТЬ: Я попытался использовать MD5 для преобразования «Employee Spec Page.doc» и «Answer Warnings.doc» и получил следующие представления символов:

Предупреждения Ответа: 2dcb2503c48f5472bfdbafe28d565a9d

Страница спецификации сотрудника: a9be4c1428c11b406072c0bd3dab2dee

Тем не менее, когда я затем конвертирую char * в беззнаковый 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/

Что я делаю неправильно? Мне нужно, чтобы оно было целым числом, иначе я не смогу сохранить идентификатор в базе данных.

1

Решение

что вам нужно это гашиш Функция генерирует число достаточно большое, чтобы избежать столкновений. MD5 (как упомянуто выше) должно быть в порядке

Вы можете генерировать более короткие ключи, просто обрезая результат MD5. но знайте, что вы увеличиваете вероятность столкновений. 128 бит имеет более 10 ^ 38 разных ключей; 64 бит имеет более 10 ^ 19; 32 бит имеет более 10 ^ 9 (4.294.967.296). таким образом, 32-битный — это почти шанс получить коллизию между двумя конкретными документами. для 10.000 документов у вас есть шанс 1% превратить хотя бы одно столкновение. принятие определенной длины ключа зависит от ваших требований. Конечно, вы можете реализовать обнаружение столкновений и разрешение столкновений.

если ваша «база данных» допускает только короткий ключ, вы должны реализовать разрешение коллизий. за идею о том, как это сделать, см. Hash_table Collision_resolution

от Википедия: ’10 ^ −18 до 10 ^ −15 — это неисправимая частота ошибок по битам типичного жесткого диска. Теоретически, хеши MD5 или UUID размером 128 битов должны оставаться в этом диапазоне до примерно 820 миллиардов документов ».


в вашу конкретную библиотеку:

если вы загляните в файл заголовка 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;

3

Другие решения

Вы можете использовать алгоритм md5 для генерации идентификатора, вы легко найдете бесплатную реализацию.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector