Подскажите алгоритм хэширования
typedef struct MyList {
SomeData somedata;
MyList *pprev;
MyList *pnext;
}MyList;
SomeData - это какая-либо структура с внутренними данными.
Есть функция которая создает элемент списка, вставляя его в нужное место и функции, работающие с элементами списка. Вопрос такой: Как мне защитить данные в MyList, чтобы юзер не имел к ним доступ. Я мыслю так: Функция создания элемента должна возвращать не сам поинтер на экземпляр MyList, а что-нибудь вроде
HASH Hash(MyList *pml);
A Функции, работающие с экземплярами соответственно на входе нринимают HASH.
Подскажите алгоритм для хэш функции! Желательно быстрый и эффективный))
Может есть какая нибудь альтернатива хэш-функциям? Запись всех указателей в массив и работа с индексом массива не катит, так как элементов структуры много и их приходится часто менять местами.
Заранее спасибо!!!
И еще один нюанс: обратная хэш функция должна знать, верный хэш или нет. То есть если GetpMyListFromHash(HASH Hash) принимаеть на входе несуществующий хэш, то она должна вернуть NULL
Чтобы пользователь мог пользоваться этими функциями в своем коде, но не мог менять данные, работая только через интерфейс функций?
Или чтобы пользователь не мог вобще скажем сделать дамп памяти работающего процесса и оттуда извлечь не зашифрованные данные? =))
Если первое то это решается средствами C++ без всяких хэшей. Просто реализуешь этот список классом. Собственно так такие вещи и реализуются. Делаешь данные приватными, а публичным только методы которые раньше были функциями. Которые и будут предоставлять нужный интерфейс работы с данными, но не предоставлять доступа к внутренней структуре списка.
А если тебе нужно хэширование, то какое - если одностороннее, то выигрыша не даст - ибо всеравно придется хэши перебирать, как индексы. Если же взаимооднозначное, то толку от него, если легко по хэшу получить изначальный адрес.
классы тут не катят. такова специфика программы. А вообще я уже вышел из положения использованием массивов. При перемещении элемента просто меняется 1 поинтер)). Но всё равно спасибо))
кстати, а если у меня есть функция которая на входе получает указатель на объект, как мне проверить является ли указатель верным???
Можно проверить на всякие явно неправильные значения типа 0 (NULL) или скажем (void*)-1, что в обычном 32-х разрядном случае равно 0xffffffff.
А что мешает всеже воспользоваться хотябы отчасти средствами ООП? Или программа пишется на голом C?
PVOID myptr=<какое нибудь заведомо неверное значение>
(myclass *)myptr->myfunc();
а классы я не использую потому что они хавают память и тормозят систему. хотя и не значительно, но при достаточно большом их количестве расходуемая память возрастает. Хотя наверное основная причина - привык на асме кодить ))
зацени такой алгоритм проверки корректности указателя:
(всё в блоке try...catch...)
PDWORD pd = (PDWORD)pMyStruc;
DWORD rez=0;
for (int i=0;i<(sizeof(mystruc)>>2);i++)
rez=rez xor pd; //я не вспомню как в сях ксор выглядит))
if (rez!=SIGNATURE_MYSTRUC) {
//ERROR!!!
}