Hashfunktion

Proggen.org - Lernprojekt: Duplikatefinder
Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Hashfunktion

Beitrag von fat-lobyte » Sa Jul 16, 2011 1:21 pm

OS: Windows 7, 64 Bit
Compiler: Microsoft Visual Studio 2005

Code: Alles auswählen

largefile.exe "einegrossedatei.iso"
sizeof(int) = 4
sizeof(long int) = 4

Filesize appears to be 0 (0 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Und das gleiche mit Microsoft Visual Studio 2010, mit x64 Target
Haters gonna hate, potatoes gonna potate.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Hashfunktion

Beitrag von nufan » Sa Jul 16, 2011 2:24 pm

Zum Testen verwende ich eine ca. 11GB große VirtualBox Festplatte.

OS: Kubuntu 11.04 (2.6.38-10), 32 Bit
Compiler: gcc version 4.5.2
glibc: 2.13
Ausgabe:

Code: Alles auswählen

sizeof(int) = 4
sizeof(long int) = 4

fopen(): Value too large for defined data type

OS: Ubuntu 11.04 (muss noch eine Alpha/Beta sein, bin nicht ganz sicher) (2.6.38-7), 64 Bit
Compiler: gcc version 4.5.2
glibc: 2.13
Ausgabe:

Code: Alles auswählen

sizeof(int) = 4
sizeof(long int) = 8

Filesize appears to be 11917148672 (11 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Ich wollte das ganze auch auf meinem FreeBSD-Rechner (433 MHz, 64 MB RAM, 8GB HDD) testen, aber der stürzte beim Mounten meiner 500GB Platte immer ab... ^^

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Hashfunktion

Beitrag von cloidnerux » Sa Jul 16, 2011 2:59 pm

Hab das ganze mal um den test von "long long int" erweitert.

Und mal so nebenbei: int ist ein "signed" datentyp, sprich 1 byte geht für das "-"-Zeichen Drauf.
unsigned int braucht das nicht und kann zahlen bis 2^32-1 speichern und nicht nur 2^31-1, was Dateigrößen bis 4GB ermöglicht.
Das Minus wird dementsprechend auch bei 8-Byte variablen sich ungünstig auswirken, da es eben auch wieder nur Zahlen bis 2^63-1 zulässt, was trotzdem noch ne ganze menge ist.

Ich habe getestet auf Ubuntu 11.04 64-Bit mit 4GB RAM und 2.6.39.1-candela.
g++: g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
glibc: 2.13
Datei wurde über

Code: Alles auswählen

dd if=/dev/zero of=testdata bs=6442450944 count=3
erzeugt.
Ausgabe:
./test testdata
sizeof(int) = 4
sizeof(long int) = 8
sizeof(long long int) = 8

Filesize appears to be 6442438656 (5 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Edit:
Unter Win 7 32 Bit 3GB ram bei einer 7Gb datei.
Compiler mingw-g++ 4.5.2
test.exe largeISO.iso
sizeof(int) = 4
sizeof(long int) = 4
sizeof(long long int) = 8

Filesize appears to be 0 (0 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Und mit Visual Studio 2008:
test largeISO.iso
sizeof(int) = 4
sizeof(long int) = 4
sizeof(long long int) = 8

Filesize appears to be 0 (0 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Hashfunktion

Beitrag von Bebu » Sa Jul 16, 2011 3:42 pm

System Linux 2.6.39 64bit
g++ 4.61
glibc 2.13
Hier ist meine Ausgabe:

Code: Alles auswählen

sizeof(int) = 4
sizeof(long int) = 8

Filesize appears to be 21305801767 (19 GB)
fread() after 2 GB boundary succeeded
fseek() to 4 GB: Invalid argument
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Hashfunktion

Beitrag von fat-lobyte » Sa Jul 16, 2011 9:13 pm

cloidnerux hat geschrieben:Und mal so nebenbei: int ist ein "signed" datentyp, sprich 1 byte geht für das "-"-Zeichen Drauf.
unsigned int braucht das nicht und kann zahlen bis 2^32-1 speichern und nicht nur 2^31-1, was Dateigrößen bis 4GB ermöglicht.
Das Minus wird dementsprechend auch bei 8-Byte variablen sich ungünstig auswirken, da es eben auch wieder nur Zahlen bis 2^63-1 zulässt, was trotzdem noch ne ganze menge ist.
Das ist richtig. Hast du dir allerdings die Referenz von fseek() angekuckt? Die erwartet nämlich weder "size_t" noch "unsigned int" sondern eben genau "long int", und zwar signed. Das geht klar auf Unix 64 bit, aber auf Windows (sowohl 32 als auch 64 bit) ist das immer noch ein 32-Bit Datentyp.

Zum Rest:
Also was ich mit dem Testprogramm zeigen wollte ist, dass es auf jeden Fall nicht so einfach möglich ist, große Dateien zu öffnen, und zwar zumindest nicht Problemfrei.
Das heißt nicht, dass es unmöglich ist, aber ich schlage vor die Lösung dieses Problems erstmal zu vertagen, es gibt noch genug zu tun.

Wenn das öffnen fehlschlägt, kann man sowieso nix machen und wenn nicht, kann man ruhig bis 2 GB freaden() und Hashen - dann überprüft man eben nur die ersten 2 GB.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Hashfunktion

Beitrag von fat-lobyte » So Jul 17, 2011 12:15 am

Viel feedback zum Code in cloidnerux PN-Eingang.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Hashfunktion

Beitrag von cloidnerux » Mo Jul 18, 2011 1:43 pm

So, mal zum Thema der großen Dateien:
So wie ich das sehe, erlaubt boost(boost/filesystem/fstream.hpp) das laden von größeren Dateien.
Die bisherigen test bestätigen dies.
Müssten wir mal sehen ob wir darauf umsteigen, was uns viel arbeit ersparen würde.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Hashfunktion

Beitrag von Bebu » Mo Jul 18, 2011 6:16 pm

cloidnerux hat geschrieben:So, mal zum Thema der großen Dateien:
So wie ich das sehe, erlaubt boost(boost/filesystem/fstream.hpp) das laden von größeren Dateien.
Die bisherigen test bestätigen dies.
Müssten wir mal sehen ob wir darauf umsteigen, was uns viel arbeit ersparen würde.
Ist das nicht dann sowieso Bestandteil des neuen C++ Standards?
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Hashfunktion

Beitrag von cloidnerux » Mo Jul 18, 2011 6:33 pm

Ist das nicht dann sowieso Bestandteil des neuen C++ Standards?
Nein, C++ Standard spezifiziert NUR die Sprache.
Die Ganzen streams sind in der Standard-Library und worüber ich rede ist boost.
Und soviel ich weiß, erlauben die momentanen C++-Streamfunktionen auch keine größeren werte als 2^31-1.
Bleibt also erstmal nur boost, wenn es dann das macht, was ich denke was es macht^^
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Hashfunktion

Beitrag von Kerli » Di Jul 19, 2011 11:41 am

cloidnerux hat geschrieben:
Ist das nicht dann sowieso Bestandteil des neuen C++ Standards?
Nein, C++ Standard spezifiziert NUR die Sprache.
Naja, der C++ Standard spezifiziert sehr wohl die Standardbibliothek, sogar auf knapp mehr als der Hälfte der Seiten ;)
Boost Filesystem kommt allerdings nicht hinein...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten