Krauti's Quelltext-Börse

Die Große Welt des WWW. Hier kann über Technik, Seiten und Programme (Browser, Messenger, Chats, Email usw) geredet werden.
Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Di 17. Jun 2003, 23:08 - Beitrag #1

Krauti's Quelltext-Börse

Ich betreibe jetzt Ausverkauf. Deswegen hau ich mal alles Snippets oder Programm-Komponenten raus, die sich bei mir so angesammelt haben (großteils Java, aber auch C++, PHP oder Perl ist dabei). Das meiste ist proof-of-concept oder Basis-Komponenten (funktionsfähige natürlich) von Programmen, die ich nicht mehr weiterentwickle oder warten will, weil ich keine Zeit mehr habe (ab Herbst: 1 Jahr Italien). Zeuchs wie Grafik-Routinen, Rumpf eines ZIP-Programms o.ä.
Es soll aber nicht umsonst gewesen sein, und so soll sie jeder, der interessiert ist, diese ausschlachten oder sich was abkucken oder lernen. Ausserdem hab ich's recht mit dem Open Source-Konzept, weswegen ich auch die fertigen Java-Proggies zusammen mit dem Quelltext raushaue.
Also ich würde gerne, sofern keine Einwände bestehen, sukzessive Snippets posten, mit Erklärung, was das soll. Wer selbst was loswerden will, immer gern ;)

Drachenmeister
Active Newbie
Active Newbie

 
Beiträge: 14
Registriert: 12.06.2003
Di 17. Jun 2003, 23:14 - Beitrag #2

Habe ich das richtig verstanden?
Das du programme verkaufen willst?:D :D :D

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Di 17. Jun 2003, 23:16 - Beitrag #3

Nö, Ausverkauf als Floskel ;)
Okay, anders gesagt: es gibt Freibier für Programmierer :D

Drachenmeister
Active Newbie
Active Newbie

 
Beiträge: 14
Registriert: 12.06.2003
Di 17. Jun 2003, 23:18 - Beitrag #4

also bekommt man programme umsonst?
ich bin zu müde um zu denken :D

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Di 17. Jun 2003, 23:23 - Beitrag #5

Dann ab in die Heia! :D

Es gibt keine fertigen Programme, aber einige (interessante, wie ich denke) Snippets, die wohl hauptsächlich für andere Programmierer interessant sein werden, weil man sie gut verwursteln kann oder mal was zu einem speziellen Gebiet sieht... wird wohl nicht die Mehrheit interessieren, schon klar, aber den einen oder anderen doch.

Drachenmeister
Active Newbie
Active Newbie

 
Beiträge: 14
Registriert: 12.06.2003
Di 17. Jun 2003, 23:25 - Beitrag #6

Schade! :D

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Mi 18. Jun 2003, 11:24 - Beitrag #7

Passwortgenerator in Java

$this->bbcode_second_pass_code('', 'import java.security.*;

class Password {
// Konstanten
public static final int DIGIT = 10;
public static final int LOWERCASE = 36;
public static final int ALNUM = 62;
// Membervariablen
private SecureRandom rand;
private char[] characters = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

public Password() throws NoSuchAlgorithmException {
rand = SecureRandom.getInstance("SHA1PRNG");
}

public String generate() {
return generate(8);
}

public String generate(int len) {
return generate(len, ALNUM);
}

public String generate(int len, int flag)
throws IllegalArgumentException {
if (flag < DIGIT || flag > ALNUM)
throw new IllegalArgumentException("invalid flag, use DIGIT, LOWERCASE or ALNUM");
rand.setSeed((long)(System.currentTimeMillis()*Math.random()));
int index;
StringBuffer sb = new StringBuffer();
byte[] data = new byte[len];
rand.nextBytes(data);
for (int i=0; i<len; i++) {
index = Math.abs(data[i]) % flag;
sb.append(characters[index]);
}
return sb.toString();
}

// Testfunktion
public static void main(String[] args) {
try {
Password pw = new Password();
System.out.println(pw.generate(6, Password.DIGIT));
System.out.println(pw.generate(8, Password.LOWERCASE));
System.out.println(pw.generate(10, Password.ALNUM));
} catch (NoSuchAlgorithmException e) {
System.err.println(e.getMessage());
System.exit(1);
} catch (IllegalArgumentException ie) {
System.err.println(ie.getMessage());
System.exit(1);
}
}

}')

Main-Methode zeigt die Anwedung:

"generate" erwartet als erstes Argument die Länge des Passworts, als zweites die Art (nur Zahlen, Zahlen und Kleinbuchstaben, alphanumerisches Passwort). Wird beides weggelassen, wird ein 8-stelliges, alphanumerisches Passwort erzeugt.

Diese Klasse wird auch in meinem Package "com.madteaparty.utilities" zu finden sein.

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Mi 18. Jun 2003, 12:22 - Beitrag #8

kleines ZIP-Programm (Java)

$this->bbcode_second_pass_code('', 'import java.io.*;
import java.util.zip.*;

public class ZombieZip {

private ZipOutputStream out;
private BufferedReader din = new BufferedReader(new InputStreamReader(System.in));
private CRC32 crc = new CRC32();
private byte[] buf = new byte[4096];
private int depth = 0;
private int currentdepth = 0;

public ZombieZip() throws IOException {
System.out.print("Wie soll die gepackte Datei heissen?\t");
String zipname = din.readLine();
checkZipname(zipname);
setOutputStream(zipname);
System.out.print("Wie tief sollen Unterordner durchsucht werden? (keiner = 0, alle = -1) ");
setDepth(din.readLine());
System.out.println();
}



private void checkZipname(String zipname) throws IOException {
if (new File(zipname).exists()) {
System.out.print("Datei existiert bereits! Ueberschreiben? (j/n)\t");
String overwrite = din.readLine();
if (!overwrite.toLowerCase().equals("j")) {
System.out.println("Ende..\n");
System.exit(0);
}
}
}



private void setOutputStream(String fname) throws IOException {
this.out = new ZipOutputStream(new FileOutputStream(fname));
}

private void setDepth(String depth) {
try {
this.depth = Integer.parseInt(depth);
} catch (NumberFormatException nfe) {
}
}

public void traverse(String[] files, String base) throws IOException {
for (int i=0; i<files.length; i++) {
if (base != null)
files[ i ] = base + "\\" + files[ i ];
File f = new File(files[ i ]);
if (f.isDirectory()) {
if (currentdepth <= depth || depth == -1) {
currentdepth++;
traverse(f.list(), f.getPath());
currentdepth--;
}
continue;
}

FileInputStream in = new FileInputStream(f);
ZipEntry zipentry = new ZipEntry(files[ i ]);
out.putNextEntry(zipentry);
System.out.println("Datei wird hinzugefuegt: " + files[ i ]);
int len;
while((len=in.read(buf)) > 0) {
crc.update(buf);
out.write(buf, 0, len);
}
zipentry.setTime(System.currentTimeMillis());
zipentry.setSize(f.length());
zipentry.setCrc(crc.getValue());
crc.reset();
out.closeEntry();
in.close();
}
}

public void finish() throws IOException {
System.out.print("\nKommentar (optional): ");
String comment = din.readLine();
if (comment.trim().length() > 0)
out.setComment(comment);
din.close();
out.close();
}



public static void main(String[] args) throws IOException {
if (args.length == 0) {
System.out.println("\nAufruf:\n");
System.out.println("java ZombieZip Datei/Verzeichnis [Datei/Verzeichnis ...]");
System.exit(1);
}
ZombieZip zipper = new ZombieZip();
zipper.traverse(args, null);
zipper.finish();
}

}')

Dieses kleine Programm dient der Demonstration, wie man einen Zipper erstellen kann. Er packt in Standardkomprimierung und kann auch ganze Ordner samt Unterordner packen, sowie einen Kommentar für das ZIP-File setzen. Besonderheit: man kann einstellen, wieviele der Unterordner eines Ordners mit eingepackt werden sollen. Das Entpacken, bzw. Editieren des Archivs ist dann nur noch ein Klacks.

Alle Dateien und Ordner, die gepackt werden sollen, werden per Kommandozeile übergeben:

java ZombieZip test.txt /usr/local/apache/htdocs /usr/local/apache/conf/httpd.conf

unter Windows doppelte Rückstriche:

java ZombieZip C:\\Apache\\htdocs

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Mi 18. Jun 2003, 12:40 - Beitrag #9

Sortieralgorithmen in C++

Datei "sort.h":

$this->bbcode_second_pass_code('', '// abstract implementation

template<class T> class AbstractSort {
protected:
void swap(T *a, T *b);
public:
virtual void sort(T *arr, int l, int r)=0;
};

template<class T> void AbstractSort<T>::swap(T *a, T *b) {
T temp = *a;
*a = *b;
*b = temp;
}

template<class T> class Insertion: public AbstractSort<T> {
protected:
void insertsort(T *arr, int l, int r, int step);
};

template<class T> void Insertion<T>::insertsort(T *arr, int l, int r, int step) {
for (int i=l+step; i<=r; i+=step) {
int j=i;
while ((j>l) && (arr[j-step] >= arr[j])) {
swap(&arr[j-step], &arr[j]);
j -= step;
}
}
}

// bubblesort

template<class T> class BubbleSort: public AbstractSort<T> {
public:
void sort(T *arr, int l, int r);
};

template<class T> void BubbleSort<T>::sort(T *arr, int l, int r) {
for(int i=r-1;i>=l;i--) {
bool switched = false;
for(int pos=l;pos<r;pos++) {
if(arr[pos]>arr[pos+1]) {
swap(&arr[pos],&arr[pos+1]);
switched = true;
}
}
if (!switched) break;
}
}

// selection sort

template<class T> class SelectionSort: public AbstractSort<T> {
public:
void sort(T *arr, int l, int r);
};

template<class T> void SelectionSort<T>::sort(T *arr, int l, int r) {
for(int i=l; i<=r; i++) {
int minPos = i;
int minVal = arr[i];
for(int j=i+1;j<=r;j++) {
if (arr[j]<arr[minPos]) {
minPos = j;
minVal = arr[j];
}
}
swap(&arr[i], &arr[minPos]);
}
}

// insertion sort

template<class T> class InsertionSort: public Insertion<T> {
public:
void sort(T *arr, int l, int r);
};

template<class T> void InsertionSort<T>::sort(T *arr, int l, int r) {
insertsort(arr, l, r, 1);
};

// shellsort

template<class T> class ShellSort: public Insertion<T> {
public:
void sort(T *arr, int l, int r);
};

template<class T> void ShellSort<T>::sort(T *arr, int l, int r) {
int step = r-l;
do {
step = (int) ceil(((float)step-1)*5/11);
for (int i=0;i<step;i++)
insertsort(arr, l+i, r, step);
} while (step > 1);
}

// heapsort

template<class T> class HeapSort: public AbstractSort<T> {
protected:
int k;
void heapify(T *arr, int l, int q, int r);
void buildheap(T *arr, int l, int r);
public:
HeapSort(int k=3) { this->k = k; }
void sort(T *arr, int l, int r);
};

template<class T> void HeapSort<T>::heapify(T *arr, int l, int q, int r) {
int largest = l+k*(q-l)+1;
if (largest <= r) {
int p = largest+k-1;
for (int i=largest+1; i<=p; i++) {
if ((i <= r) && (arr[i]>arr[largest]))
largest = i;
}
if (arr[largest]>arr[q]) {
swap(&arr[q], &arr[largest]);
heapify(arr, l, largest, r);
}
}
}

template<class T> void HeapSort<T>::buildheap(T *arr, int l, int r) {
for (int i = (int)((r-l-1)/k); i>=0; i--)
heapify(arr, l, l+i, r);
}



template<class T> void HeapSort<T>::sort(T *arr, int l, int r) {
buildheap(arr, l, r);
for (int i=r; i>l; i--) {
swap(&arr[l], &arr[i]);
heapify(arr, l, l, i-1);
}
}

// quicksort, getuned mit Insertsort

template<class T> class QuickSort: public Insertion<T> {
protected:
int partition(T *arr, int l, int r);
public:
void sort(T *arr, int l, int r);
};

template<class T> int QuickSort<T>::partition(T *arr, int l, int r) {
int x = (l+r)/2;
int i = l-1;
int j = r+1;
if (arr[x] > arr[r]) swap(&arr[x], &arr[r]);
if (arr[l] > arr[r]) swap(&arr[l], &arr[r]);
if (arr[l] > arr[x]) swap(&arr[l], &arr[x]);
while (true) {
do {j--;} while (arr[j] > arr[x]);
do {i++;} while (arr[i] < arr[x]);
if (i < j) {
swap(&arr[i], &arr[j]);
if (i == x) { x = j; }
else if (j == x) { x = i; }
} else { return j; }
}
}

template<class T> void QuickSort<T>::sort(T *arr, int l, int r) {
if (r-l > 30) {
int q = partition(arr, l, r);
sort(arr, q+1, r);
sort(arr, l, q);
} else {
insertsort(arr, l, r, 1);
}
}

// mergesort

template<class T> class MergeSort: public AbstractSort<T> {
protected:
void merge(T *arr, int l, int q, int r);
public:
void sort(T *arr, int l, int r);
};

template<class T> void MergeSort<T>::merge(T *arr, int l, int q, int r) {
T *target = new T[r+1];
int i, j;
for(i=l; i<=q; i++)
target[i] = arr[i];
for(j=q+1; j<=r; j++)
target[r+q+1-j] = arr[j];
i = l;
j = r;
for(int k=l; k<=r; k++) {
if (target[i] <= target[j]) {
arr[k] = target[i];
i++;
} else {
arr[k] = target[j];
j--;
}
}
delete[] target;
}

template<class T> void MergeSort<T>::sort(T *arr, int l, int r) {
if (l < r) {
int q = (l+r)/2;
sort(arr, l, q);
sort(arr, q+1, r);
merge(arr, l, q, r);
}
}
')

Hierbei handelt sich sich um Standardimplementierungen der Sortieralgorithmen, wobei allerdings, wenn ich nochmal Zeit habe, Quicksort und Mergesort noch ein Tuning vertragen. Ein B-Sort, dass auf B-Trees basiert (dieses Verfahren wird z.B. auch von MySQL zur Indexverwaltung eingesetzt), ist noch angedacht. Toppt in der Laufzeit selbst Spitzenreiter Quicksort.

Verwendung im Programm z.B.:
$this->bbcode_second_pass_code('', 'HeapSort<int> hs;
hs.sort(meinArray, 0, SIZE);')

Start und Ende sind als Indexposititionen anzugeben. Dieser Bereich wird dann sortiert. Übrigens GNU-kompatibel, lässt sich in UNIX-C++-Projekte genauso einbauen.

LEMiX
Excellent Member
Excellent Member

Benutzeravatar
 
Beiträge: 692
Registriert: 27.01.2003
Do 26. Jun 2003, 17:00 - Beitrag #10

Hast du auch Codes für C#?

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Do 26. Jun 2003, 17:23 - Beitrag #11

Leider nein, obwohl mich die Sprache sehr interessiert (kein Wunder, bin ich doch ausgesprochener Java- und C++-Liebhaber bin). C# ist aber ans .NET-Framework gebunden, und XP kommt mir aus Prizip nicht ins Haus (mal abgesehen davon, dass ich mir "Professional" sowieso nicht leisten kann und ein Win 2000 legal praktisch nicht mehr zu kriegen ist). Zumindest hab ich noch keinen Compiler außerhalb davon gefunden.

Ergänzung zu meinen Codes:

ich habe die Sortier-Bibliothek nochmal gründlich überarbeitet.
Shell-Sort arbeitet jetzt mit dem "11/5-Verfahren" und bietet damit das beste Preis-Leistungs-Verhältnis, weil der Speicherbedarf recht gering ist.
Quicksort wurde für den "Worst-Case" besser gerüstet, außerdem werden jetzt kleine Teil-Arrays (< 30) an Insertsort übergeben, denn das ist ein Schwachpunkt von Quicksort. Laufzeit müsste jetzt ziemlich hervorragend sein, jedenfalls konnte ich auf meinem Testrechner (P III 500) Arrays mit mehreren 100000 Elementen in weniger als 1 Sekunde sortieren. Ich weiß nur noch nicht ganz, wie ich das am effektivsten Benchmarken soll, der genaue Durchschnittswert würde mich jetzt selbst interessieren.
Edit: hab mal Microsekunden genommen... auf dem Testrechner nur in Ausnahmefällen länger als 0,07 Sekunden gelaufen.

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Sa 28. Jun 2003, 19:58 - Beitrag #12

Taschenrechner (Java-Applet)

Als nächstes möchte ich meinen kleinen Taschenrechner allen zur Verfüngung stellen:
http://www.mad-teaparty.com/Chrstph/taschenrechner.html

Quelltext ist zum Posten zu lange, aber im Zip-File ist er mit drin.

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Sa 5. Jul 2003, 10:16 - Beitrag #13

Bulletin Board Code Parser (Java)

Ich hab mal gekuckt, ob man das Dingens, das im Hintergrund der meisten Foren und vieler NewsScripts und Gästebücher arbeitet und euch die HTML-Formatierungen abnimmt - die Rede ist von den sog. "BBCodeParsern" - elegant in Java umsetzen kann. Ergebnis: sogar sehr elegant! Dank der Objektorientierung kann man auf wirkliche paarweise Abbildungen von Patterns und Replacements zurückgreifen, Membervariablen und Methoden mit "protected" schützen und Techniken wie Polymorphie anwenden.
Quelltext ist mit 10 KB fast zu lange, um es zu posten, aber wer sich die Techniken ansehen will (ist in erster Linie ein Lehrstück zur Benutzung von Collections und regulären Ausdrücken (seit JDK1.4)), kann es hier downloaden:
http://www.mad-teaparty.com/Chrstph/downloads/BBCodeParser.zip

Tut alles, was mittlerweile Standard ist: URLs umwandeln, Bilder bei bedarf in Links umwandeln, Smilies, Codetags und bei Bedarf auch Zensur. Pro Aufruf einzeln einstellbar. Mit Auslesen aus der DB, um leicht ein Admin-Tool drumrumzubauen. Er sorgt allerdings noch nicht für sicheres HTML (bsp. wenn einer zwischen Listentags andern Mist reinschreibt) und verhindert die Ersetzung innerhalb bestimmter Tags, z.B. CODE, noch nicht. In Ermangelung einer Callback-Fuktion (PHP) und des e-Modifiers ("evaluate", Perl und PHP) muss das "Kaschieren" und erneutes Übersetzen emuliert werden. Das hab ich bereits angedeutet: mit der Matcher-Methode "group" kriegt man den selben (gruppierten) Inhalt raus wie aus $1, $2 etc. War aber zu faul, das auch noch mit reinzumachen, weil es an nur einem (verlängerten) Nachmittag entstanden ist. Deswegen garantiere ich nicht für Fehlerfreiheit, wie gesagt, die Quelltexte hier sind in erster Linie Anschauungsmaterial. Wer will kann aber trotzdem dran rumspielen oder es gar irgendwo verwenden.
Allerdings ist die Performance recht mies. Liegt daran, dass in Java sowohl die regulären Ausdrücke als auch der Datenbanktreiber selbst in Java gecodet wurden, und das ist halt mal langsamer als C oder C++. Die Datenbankverbindung im Konstruktor ist deshalb nicht mehr als eine Behelfslösung, um es standalone zu testen (gerade DB-Verbindungs-Aufbau frißt in Java Zeit...). Also wenn ich das in einem Forum auf Servlet-Basis einsetzen wollte, würde ich mich um vernünftiges "Connection-Pooling" bemühen. Oder aber die Parser-Instanz als Membervariable der Servlet-Klasse festsetzen. Weil Servlets kompilierte Programme sind, die vom Server "am Leben" gehalten werden, wird das Servlet nur beim ersten Aufruf konstruiert, was bedeutet, dass auch Membervariablen nur einmal angelegt werden. Würde bedeuten, für den Normalbetrieb wäre dann kein Nachladen aus der DB und kompilieren der Patterns mehr erforderlich, und dann wär's wieder recht flott... Wenn man allerdings was an der DB ändert, müsste man entweder den Server neu starten, um die Instanz zu vernichten, oder man sorgt für eine geeignete "fireUpdate"-Methode, die nur bei Bedarf nachlädt.

Ach ja, wer es mal ausprobieren will, läuft per Testfunktion auf Konsole. Braucht allerdings MySQL und den J-Connector im Classpath (ggf. im Programm Name und Passwort zur DB abändern).

Anm: bei den Listen bin ich einen anderen, (X)HTML-kompatibleren Weg gegangen. Ich will alles steuerbar machen, ohne wegen jedem Furz eine eigene Methode zur Behandlung schreiben zu müssen. Wenn man MySQL4 verwendet, sollte man tunlichst nicht TINYINT(1) als Domain verwenden, sondern, so wie's sich eigentlich gehört, BIT oder BOOL.

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Sa 12. Jul 2003, 20:01 - Beitrag #14

Ich habe eine erste fertige Version von meinem Java-Package.
Übersicht: http://www.mad-teaparty.com/Chrstph/package
Download (inkl. Sourcen): http://www.mad-teaparty.com/Chrstph/downloads/madteaparty_packages.zip

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Mi 16. Jul 2003, 13:17 - Beitrag #15

Ich hab nochmal an meinen Sortieralgorithmen geschraubt, und v.a. bei Quicksort noch ein paar Optimierungen gefunden.
Hab ein Testprogramm drumrumgeschraubt, allerdings vorerst noch für Linux:
http://www.mad-teaparty.com/Chrstph/downloads/sortieralgorithmen.tar.gz
(da ist auch die Bib drin, welche auch unter Windows läuft, nur das Testprogramm verwendet POSIX-Funktionen)

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Mi 16. Jul 2003, 16:43 - Beitrag #16

Das dürfte auch interessant sein: gerade bei MD5 und SHA1 will man ja oft einen Hex-String geliefert bekommen. Zumindest tun das die Implementationen von PHP, Perl, Python und auch die JavaScript-Versionen, die ich bisher gesehen habe. Die Java-Methoden nehmen allerdings nur byte-Arrays auf und geben wieder byte-Arrays zurück (16-elementige im Falle des 128-Bit-MD5 und 20 elementige im Falle des 160-Bit-SHA).

Ich habe eine Wrapper-Klasse geschrieben, die die Methoden "update" und "digest" für den Betrieb mit Strings und char-Arrays rüstet. Evtl. leite ich diese Klasse noch direkt von java.security.MessageDigest ab:

$this->bbcode_second_pass_code('', 'import java.security.*;

public class MD {

private MessageDigest md;

public MD(String algorithm) throws NoSuchAlgorithmException {
md = MessageDigest.getInstance("SHA");
}

/*
* Konvertiert ein Byte-Array in einen Hex-String.
*/
public String toHexString(byte[] b) {
StringBuffer sb = new StringBuffer(40);
for (int i=0; i<b.length; i++) {
int value = (b[i] & 0x7F) + (b[i] < 0 ? 128 : 0);
String add = (value < 16 ? "0" : "");
add += Integer.toHexString(value);
sb.append(add);
}
return sb.toString();
}

/*
* update-Methoden für Strings und Character-Arrays
*/
public void update(String s) {
update(s, 0, s.length());
}

public void update(char[] c) {
update(new String(c), 0, c.length);
}

public void update(String s, int off, int len) {
md.update(s.getBytes(), off, len);
}

/*
* Digest zurücksetzen
*/
public void reset() {
md.reset();
}

/*
* Digest berechnen
*/
public String digest() {
return toHexString(md.digest());
}

public String digest(String s) {
update(s);
return digest();
}

public String digest(char[] c) {
update(c);
return digest();
}

public String digest(String s, int off, int len) {
update(s, off, len);
return digest();
}

// Testfunktion
public static void main(String[] args) {
try {
//MessageDigest erstellen
MD sha1 = new MD("SHA");
String s = new String("hallo");
sha1.update(s);
System.out.println(sha1.digest());
sha1.reset();
} catch (Exception e) {
System.err.println(e.toString());
System.exit(1);
}
}
}')
Ich habe auch bereits eine eigene Implementation in der Mache (beschäftige mich gerade mit Kryptographie), basierend auf der JS-Implementation von Paul Johnston unter http://pajhome.org.uk/crypt/md5/sha1src.html (meiner Meinung nach eine der kompaktesten und flexibelsten Implementierungen, wo gibt), verfeinert mit eigenen Optimierungen und Ideen aus einer C-Implementierung (http://www.faqs.org/rfcs/rfc3174.html, letzterer Link erklärt auch die Funktionsweise solcher MessageDigests ganz narrensicher, für die, die's interessiert). Angepasst an die Java-API, natürlich.
Ich überlege gerade, ob ich das dann einem Package hinzufügen soll. Aber gerade die "lange" Version und die Hüllklasse in einem könnten Verwirrung stiften. Oder nicht?

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Do 17. Jul 2003, 17:55 - Beitrag #17

Die Klassen in java.security lassen sich schlecht ableiten (wg. statischen Klassen "Delegator"), also war ich Masochist genug, doch selbst eins aufzusetzen.
http://www.mad-teaparty.com/Chrstph/package/index.html
Der SHA-Algorithmus arbeitet schonmal korrekt, allerdings bin ich mit den internen Durchläufen noch nicht zufrieden, das muss noch kompatibler werden, habe aber schon Ideen zur Optimierung. MD5 ist auf jeden Fall auch noch geplant, und dann mal sehen...
Jetzt hab ich aber erstmal die Schnauze voll, von dem Zeug wird einem ja tendenziell schwindelig ;)

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Di 22. Jul 2003, 22:06 - Beitrag #18

http://www.mad-teaparty.com/Chrstph/crypto.html

Zwar (noch) nix mit Quelltext, aber eine (interessante?) Spielerei ist es, finde ich, schon.
Derzeit kann man sich den Digest zu MD4, MD5, SHA1 und RIPEMD160 abholen.
Wobei MD4 recht unsicher ist und man auch von MD5 langsam wegkommen sollte.
Weiteres ist geplant.
Die Implementierung basiert im Übrigen auf den Referenzcodes in C, mit eigenen Anpassungen und Laufzeitoptimierungen (im Hinblick auf Java-Methoden).

Krautwiggerl
Royal Member
Royal Member

 
Beiträge: 1603
Registriert: 12.12.2000
Mo 28. Jul 2003, 18:11 - Beitrag #19

Heute kann ich mal eine echte Novität präsentieren, und zwar eine Version des "Haval"-Algorithmus. Er ist insofern exzentrisch, als dass man ihn mit 128, 160, 192, 224 und 256 Bit laufen lassen kann und zwischen 3, 4 oder 5 Durchläufen wählen kann. Ergibt insgesamt 15 verschiedene Digests.
Im Netz sind, abgesehen vom Paper und des Referenzcodes in C, sehr schwer Code-Beispiele aufzutreiben. Für Java fand ich gar keins. Deshalb behaupte ich mal (mag mich auch irren), dass ich der erste bin, der einen Java-Referenzquelltext mit allen Funktionen zur offenen Einsicht bietet, zumindest solange die Version 2 des GNU-Crypto-Projekts nicht rauskommt.
Download: http://www.mad-teaparty.com/Chrstph/downloads/Haval.java
Als Beispiel auch in meinem Applet zu finden.

Voronwe
Good Member
Good Member

Benutzeravatar
 
Beiträge: 458
Registriert: 24.08.2002
Do 31. Jul 2003, 18:47 - Beitrag #20

ICh hab atm nur drüber geschaut aber sag jetzt schon mal; dickes Respekt!
un danke :D dafür denk ich werd ich noch ne menge gebrauch finden!

Nächste

Zurück zu Internet

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste