Ik ben bezig aan een projectje die byte na byte inleest en markers plaatst waar het een bepaald patroon tegenkomt. Het bestand wordt "afgesplitst" op die markers en er wordt een Tiger-hash aan elk stukje toegekend. Op die manier zou het heel gemakkelijk zijn om "op afstand" te kijken hoe vergelijkbaar bestanden zijn door gewoon te zien welke stukken overeen komen aan de hand van die hashes.
Deze kleine algorithm heeft wel een grote bottleneck: De IO. Ik gebruik al reeds een BufferedStream, dus dit zou al geen probleem meer mogen zijn? Misschien vergeet ik enkele optimalisaties...
De code kan je hier weervinden: http://flox.svn.sourcefor...vc/flox/FloxNegC%23/Flox/
De IO wordt verzorgd door een BinaryReader die ik voor het gemak overerfde in een nieuwe klasse, zodat de BufferedStream automatisch wordt toegevoegd.
Deze kleine algorithm heeft wel een grote bottleneck: De IO. Ik gebruik al reeds een BufferedStream, dus dit zou al geen probleem meer mogen zijn? Misschien vergeet ik enkele optimalisaties...
De code kan je hier weervinden: http://flox.svn.sourcefor...vc/flox/FloxNegC%23/Flox/
De IO wordt verzorgd door een BinaryReader die ik voor het gemak overerfde in een nieuwe klasse, zodat de BufferedStream automatisch wordt toegevoegd.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| using System.IO; namespace Flox { /// <summary> /// Extends the <see cref="T:System.IO.BinaryReader"/> class with a <see cref="T:System.IO.BufferedStream"/>. /// </summary> class ByteReader : BinaryReader { /// <summary> /// Acts as a buffer for the size of the <see cref="T:System.IO.BufferedStream"/> to reduce calls. /// </summary> public long StreamSize { get; private set; } /// <summary> /// Makes it easier to read out the position of the <see cref="T:System.IO.BufferedStream"/>. /// </summary> public long Position { get { return base.BaseStream.Position; } set { base.BaseStream.Position = value; } } /// <summary> /// Standard constructor which loads a file into a <see cref="T:System.IO.BufferedStream"/> and a <see cref="T:System.IO.BinaryReader"/>. /// </summary> /// <param name="bestand">The path to the file.</param> public ByteReader(string bestand) : base((new BufferedStream(File.OpenRead(bestand)))) { StreamSize = base.BaseStream.Length; } } } |