Domino 9 und frühere Versionen > ND6: Entwicklung
Wie HASH Wert eines Anhangs bestimmen ?
eknori:
Bevor ich mir die Finger selber wundschreibe, wollte ich mal fragen, ob irgendwer einen LS oder C-API Algorithmus parat hat, mit dem man 2 attachments bit-genau vergleichen kann ?
Hintergrund ist, herauszufinden, wie viele gleiche Anhänge in n Notes Datenbanken enthalten sind, und wie gross die Ersparnis an Speicherplatz ist, wenn man nur ein zentral gespeichertes attachment hat und alle docs, die diesen Anhang ursprünglich beinhalteten nur darauf referenzieren.
also Dublettenprüfung ...
m3:
Ev. per MD5? http://www.nsftools.com/tips/NotesTips.htm#lsencryption oder http://wwwendt.de/tech/md5/
flaite:
Offensichtlich gibt es eigentlich gerade in C sehr viele diff tools.
google: diff ODER diff C++
Das schwierige wäre für mich erst einmal die Domino Daten in eine Struktur zu bringen, um einen Vergleich einfach möglich zu machen.
Vielleicht per xml Dom Api Informationen aus den Domino Dokumenten in eine Verzeichnisstruktur auf die Festplatte schreiben.
Verzeichnis-name: DokUnique ID
a) description.xml -> Datenbankname, Server, UniversalId.
b) Die base64 encodierten Attachments (in dxl vorhanden) als eigene Dateien in das Verzeichnis.
Über die b)s könnte man dann diff-Tools füttern.
Vermutlich nicht wirklich an einen Nachmittag zu erledigen. Wär mein erster Ansatz.
Gruß Axel
eknori:
ich denke, ich werde es mal hiermit versuchen ( http://www.codeproject.com/cpp/chash.asp )
eknori:
Fluppt ganz gut mit der Klasse; jetzt muss ich mal sehen, wie ich das hinbekomme, daß ich die Datei nicht erst detachen muss, sondern den hashWert gleich im Speicher berechnen kann.
Das Ganze könnte man dann in eine DLL packen und die Funktionen dann per DECLARE in LS bekanntmachen; oder wenn man schon eine DLL bastelt, kann man die Funktionen auch per COM zur Verfügung stellen.
Wer es nachbauen möchte, hier der Quellcode.
Das Programm ermittelt die has-werte aller Dateien im LW K:\ und gibt die Werte an der Konsole aus.
--- Zitat ---/////////////////////////////////////////////////////////////////////////////
// nHash.cpp
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "nHash.h"
#include "CHash.cpp"
#include "SADirRead.cpp"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
nRetCode = 1;
}
else
{
CSADirRead dr;
CString outHash;
dr.ClearDirs();
dr.GetDirs("k:\\", false);
dr.ClearFiles(); // start clean
dr.GetFiles("*.*"); // get all files in k:\\
CSADirRead::SAFileVector &files = dr.Files();
CHash hashObj; // Define a CHash object
hashObj.SetHashAlgorithm(SHA2); // Set the algorithm
hashObj.SetHashFormat(3);
hashObj.SetSHA2Strength(512); // Set the SHA-2 strength
hashObj.SetHashOperation(FILE_HASH); // Set the operation
for (CSADirRead::SAFileVector::const_iterator fit = files.begin(); fit!=files.end(); fit++)
{
hashObj.SetHashFile(("%s\n", (*fit).m_sName)); // Set the file
outHash = hashObj.DoHash(); // HashIt !
printf(outHash) ;
std::cout << endl;
}
}
return nRetCode;
}
--- Ende Zitat ---
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln