AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Unnamed-Projekt > BigInt, MD5, RipeMD320, SHA, Streams usw.
Thema durchsuchen
Ansicht
Themen-Optionen

Unnamed-Projekt > BigInt, MD5, RipeMD320, SHA, Streams usw.

Ein Thema von himitsu · begonnen am 23. Mai 2008 · letzter Beitrag vom 19. Feb 2016
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
Also, wie Versprochen hier mal die ersten Teile meines kleinen Projekes.

es wird mal 'ne Art nonVCL-Framework und benötigt keine Fremdkomponenten/-Units und es werden auch nur die nötigsten Delphi-Units benötigt (per Standard nur System, SysInit und SysConst)

* das ganze Projekt ist auf Minimalismus ausgelegt,
also es wird niemals so groß wie z.B. die JEDIs, aber es soll das "Nötigste" enthalten
außerdem wird auf minimalsten Speicherverbrauch/Overhead geachtet
* es ist aktuell in einen Debugmodus versetzt und auch die Inlinefunktionen sind deaktivert
* alte/neue Demo-/Testprojekte liegen im Unterverzeichnis "Demo"
und in der Project.dpr befinden sich aktuelle Test-/Democodes zur TBigInt
* speziell in der FMath.pas sind noch unfertige Funktionen drin ... einfach mal nach "///" ausschau halten, außerdem wird bei Verwendung der entsprechende Funktionen eine Exception ausgelößt.

!!! Achtung: Vorraussetzung ist mindestens:
- BDS 2006, Delphi 2006, Turbo Delphi (incl. Updates)
- Windows 2000 Professional oder Neuer



"wichtige" aktuell enthaltene Elemente:
  • FVersionsCheck.inc
    Delphi-Versiontests
    Optionen (alternativ über Delphiprojektoptionen)
    > Userdefinitionen im Abschnitt "Private" (ab Zeile 705) und Beschreibungen siehe nachfolgenden Abschnitt
  • FType.pas
    (Basis)Typendefinitionen
  • FBinary.pas
    ByteSwap, BitSwap, RoL, RoR, OpenBit(MSB), CloseBit(LSB), CountBits, OneBit(MSB+LSB)
    Swap(Speicher tauschen), FindData(binärdaten suchen)
  • FMath.pas
    TBigInt > 512 bit integer = -2^511 .. 2^511 - 1 = ±6.703e153
    'nen paar Zufallsfunktionen
  • FStream.pas
    IStream > Windows IStream-Interface
    TnFileStream
    TnMemoryStream
    TnMemoryMappedStream
    TnIStream > IStream-Kapselung
    TnStream > TnFileStream + TnMemoryStream + TnMemoryMappedStream
  • FHash.pas
    Windows MD5- und SHA-API
    ThMD5 > Kapselung der WinAPI
    ThSHA > Kapselung der WinAPI
    ThxCRC32Table > CRC32-Rechentabelle
    ThxCRC32 > CRC32-"Klasse"
    ThxMD5 > MD5-"Klasse" (16 Byte)
    ThxRMD320 > Ripe MD320-"Klasse" ('ne Art 40 Byte-MD5)
  • FResXPMan.pas
    XP-Manifest
  • FResXPManAdmin.pas
    XP-Manifest mit Anforderung von Adminrechten

viele "Klassen" bauen auf Records auf ... können also wie jede "billige" Variable verwende werden
(also ohne Initialisation/Finalisation) und kommen vorallem ohne jeglichen Ovehead seitens der Objektverwaltung aus.
z.B.
Delphi-Quellcode:
Var Hash: ThMD5;
  S: String;

Begin
  Hash.Init;
  Hash.Update('123');
  Hash.Final;
  S := Hash.asHexString;

  Hash.Calc('123');
  S := Hash.asHexString;

  Hash.CalcFile('C:\Text.dat');
  S := Hash.asHexString;

  // oder gleich direkt
  S := Hash.CalcFile('C:\Text.dat').asHexString;
End;
RAM-Verbrauch von z.B. ThxCRC32 und TnFileStream liegen bei genau 4 Byte ... halt genau die Recordgröße (exclusive des Verbrauchs enthaltener Windowskomponenten)

Speziell auf sowas wie TBigInt und das zukünftige TBigFloat hat der Aufbau als Record große positive Auswirkungen, denn
  • Speichermanagement optimal gelöst (meißt liegt die Variable direkt im Stack, oder auf'm Heap)
    also vom Typ selbst gehen keine Anfagen an den Memorymanager und Dergleichen
  • die Variableninhalte liegen direkt in anderen Stuckturen (z.B. Records und Arrays) eingebettet
    > es gibt keine externen Daten über Pointer und so.
    = perfekt für Speicherung und Datenübertragung
    (z.B. von normalen Strings kennt man es ja, daß dessen Daten woanders liegen, als die Stringvariable)

[neu]
aktueller Funktionsumfang von TBigInt:

automatische/implizite Konvertierung
von: Integer, Int64, String
nach: Integer, Int64, Float(Extended), String

explizite Konvertierung
von und nach: Int64, Integer, UInt64, LongWord/Cardinal, Currency, Extended, String

Vergleiche ( = <> < <= >= > )
mit: TBigInt, Int64, Integer, Currency, Extended, String

Operatoren ( + - * div mod and or xor )
mit: TBigInt, Int64, Integer, String

Operatoren2 ( inc dec + - not shl shr )

Record(Klassen)-Proceduren:
Load/Save: TBigInt, Int64, Integer, UInt64, LongWord/Cardinal, String, TnStream(TnFileStream,TnMemoryStream,TnMemoryMappe dSream)
MinBigInt/MaxBigInt (Konstanten)
Compare, Add, Subtract, Multiply, Divide, Modulus, DivMod
Power, LdExp(2), LtExp(10), LxExp, ExpMod, Log2 Log10, LogN, Radic, Sqr, Sqrt,
Fibonacci, RoundTo
bAnd, bOr, bXor, bNot
Inc, Dec, Abs, NegAbs, Negative
bShl, bShr, Rol, Ror, aShl, aShr
Sign, isZero, isPositive, isNegative, isOdd, isEven,
OpenBit(MSB), CloseBit[LSB], CountBits, OneBit[MSB+LSB]

[u]Record(Klassen)-Properties:[u]
asString, asStringT(with thousands separator), asHexString

> meißt sollte Byte und Word auch mit durch Integer abgearbeitet werden können
[/neu]

[new]
die TBigInt gibt es inzwischen auch einzeln (unabhängig von diesem Projekt)
siehe Beitrag #13
[/new]




und dann noch ein Problem:
erstmal ist mir noch kein Name dafür eingefallen ... falls also wer eine Idee hat ...

Geschichte:
dieses Projekt ist 'ne Neuauflage meines nie veröffentlichten UCCs,
ist allerdings nicht mehr vorrangig auf Unicode ausgelegt
und soll dafür eine nette Win-API-Kapslung inlc. einiger nonVCL-Objekte, welche hoffentlich den Zugriff erleichtern, werden.
Und dazu kommt noch 'ne kleine Funktions/Objektsamung hinzu (z.B. TBigInt und Co.)


Lizenz: da fast alles von mir selber ist, liegt das Copyright wohl auch bei mir
außer wo es explizit im QuellCode, bei den entsprechenden Funktionen, dabei steht

die Grundlagen zur FBinary.BitSwap (speziell von BitSwap(i: LongWord): LongWord; ) hatte ich mal hier aus dem Forum, weiß aber nicht mehr von wem ... wäre schön, wenn sich dazu die Person wieder anfinden würde, damit ich diese erwähnen kann)


[add 22.01.2009]
die Hashfunktionen wurden etwas überarbeitet
siehe Beitrag #18
- Delphi 2009 Kompatibilität
- als Einzeldatei verwendbar
(Achtung: in diesem Post wurde die Delphi 2009-Änderungen noch nicht geupdatet)
[/add]
Angehängte Dateien
Dateityp: 7z nonvcl_267.7z (359,8 KB, 283x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
 
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#11
  Alt 26. Mai 2008, 13:17
@gammatester: ich könnte es notfalls auch als ZIP hochladen, aber 7zip ist doch inzwischen kein ungewöhnliches Format mehr?

Wei Dai's Crypto++ Seite schau ich mir gleich mal an.

und was den Link betrifft: hatte einfach in Google gesucht und das war einfach eine der ersten Seiten, wo ich genug und hübsche Prüfmuster fand.

deine weitere Anregung betreffend, hatte damals eigentlich nicht vor noch was an dieser Implementation zu verändern (ist zwar nicht die Schnellste, aber mir gefiehl sie so ganz gut) und sie lief auch eigentlich.
nja, direkt in die Projektdateien mach ich die Prüffunktionen wohl nicht rein, aber ich werd' mein kleines Prüfprogrämmhen weiter ausbauen (vielleicht mal mit 'ner übersichtlichen GUI).
Im Endefekt wird ja kaum mal was geändert, wenn es einmal läuft ... wird also vermutlich nicht häufig genutzt.

Zitat von sx2008:
Warum sind denn so viele Deklarationen aus Unit Windows enthalten?
Schließlich vergrössert die Unit Windows eine Anwendung nicht (und wenn doch, dann nur unwesentlich).
Da ich Erstens alles zusammen haben wollte,

Zweitens einige Änderungen gegenüber den Delphi-Deklarationen drin hab ... es ist mehr am MSDN ausgerichtet und außerdem hat Delphi einige Fehler drin (vorallem beim Unicode)

und Drittens hab ich (versuch es zumindestens) die aktuellsten Definitionen zu nutzen.
in Delphi ist noch nichtmal alles vom XP drin ... ich bin da nur auf'm Stand des WinSDK v6.1 (Windows Vista / Windows Server 2008)

oder was glaubst du warum noch andere WinAPIs für Delphi anbieten?
(z.B. die ganzen JEDI-APIs ... ich sortiere es nur etwas anderes und passe es noch etwas ans Projekt an)

Aber vorallem hab ich versucht alles loszuwerden, was 'nen Initialization-/Finalizationabschnitt enthält ... ich weiß, Windows.pas ist noch recht harmlos, aber wenn man einmal nicht konsequent ist .........




so, das kleine Testprojekt läuft erstmal.
jetzt muß ich nur noch die Fehler in ThxMD5 und ThxRMD320 finden

tja und dann sollte ich mir noch ein paar Prüfmuster für BigInt und Co. einfallen lassen
Angehängte Dateien
Dateityp: dpr unittest_713.dpr (12,5 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#12
  Alt 27. Mai 2008, 11:43
Sooooo, der Fehler in den Hashfunktionen hat sich angefunden ... mußte mal ein Backup zurückspielen und da fehlten noch die damals aktuellen Änderungen (die Adressen zu den neuen Varialenpositionen waren nicht mehr angepaßt)

tja und beim Filehash hatte sich ein witziger Fehler eingeschlichen ... "Final" wurde dopelt ausgeführt


neue Dateien und kleine Ergänzung ( [neu] ) siehe ersten Post

und hier im Anhang nicht wundern ... die 5 Fehlermeldungen sind korrekt, schließlich fehlt die Testdatei für jeweils den ersten Filehashtest. (oben im Pojekt ist aber alles drin)
Angehängte Dateien
Dateityp: exe unittest_518.exe (43,5 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#13
  Alt 31. Mai 2008, 12:32
Aufgrund des Themas
Exponentieren und dann Modulo: große Zahlen - speziell die Beiträge #30 bis #33
hab ich mal die BigInt-"Klasse" extrahiert.

Systemvoraussetzung ebenfalls mindestens Delphi/BDS 2006 incl. der nötigen Updates.

Wertebereich:
von -6.703.903.964.971.298.549.787.012.499.102.923.063. 739.682.910.296.196.688.861.780.
721.860.882.015.036.773.488.400.937.149.083.451.71 3.845.015.929.093.243.025.426.876.941.405.973.284. 973.216.824.503.042.048
bis +6.703.903.964.971.298.549.787.012.499.102.923.063 .739.682.910.296.196.688.861.780.
721.860.882.015.036.773.488.400.937.149.083.451.71 3.845.015.929.093.243.025.426.876.941.405.973.284. 973.216.824.503.042.047

+/- 6.703e153
-2^511 .. 2^511 - 1

512 Bit im Zweierkomplement = 152(153) Dezimalstellen
Int64 = 18(19) Dezimalstellen


die Klasse ist fast identisch mit dem Original
- Funktion .OneBit fehlt (braucht aber vermutlich eh keiner)
- TnStream durch TStream ersetzt
- interne Funktionen auf Private gesetzt
- keine ASM-Optimierungen (gibt aber eh kaum welche)
- und es wird natürlich nur diese eine Unit benötigt


Vieles wie beim "normalen" Integer auch nutzbar:

< <= = <> >= >
+ - div mod
and or xor not shl shr
Inc Dec

und als Funktionen in der Klasse und einiges nochmals als Einzelfunktion in der Unit (siehe nach der Klassendefinition) unter Anderem dieses:
DivMod Power LdExp LtExp LxExp ExpMod Log2 Log10 LogN Radic Sqr Sqrt Fibonacci RoundTo RoL RoR



da dieses einen "normalen" Record darstellt, ist auch keine Initialisierung/Finalisierung nötig, wie z.B. bei Objekten.
und man kann diesen Record auch wie einen verwenden ... z.B. Speichern und Laden:
Delphi-Quellcode:
Var BI: TBigInt;
  F: File...;
  S: TStream;
  P: Pointer;

BlockWrite(f, BI, SizeOf(BI));
S.Write(BI, SizeOf(BI));
MoveMemory(P, @BI, SizeOf(BI));


ich hoff mal es läuft alles soweit.
ansonsten wird es hiervon nicht all zu oft ein Update geben können.
(ist halt etwas Aufwand jede Änderung im großen Projekt auch gleich hier einzubauen)

[edit=Daniel G]Wertebereich zum Vermeiden des horizontalen Scrollens mal umgebrochen. Tut ja nicht not, sowas...[/edit]
Angehängte Dateien
Dateityp: pas bigint_203.pas (95,6 KB, 72x aufgerufen)
Dateityp: dpr biginttest_970.dpr (5,6 KB, 48x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von vsilverlord
vsilverlord

 
RAD-Studio 2009 Arc
 
#14
  Alt 31. Mai 2008, 17:24
Gibt es eine Möglichkeit, die Unit auch unter Delphi 7 enterprise zu nutzen?
Volker
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#15
  Alt 31. Mai 2008, 17:58
so wie sie jetzt ist, leider nicht (mein altes D7 fühlt sich auch schon etwas vernachlässigt )

Es wird halt von erst in Delphi 2006 eingeführten Compilerfeatures gebrauch gemacht.


ich könnte höchstens die Grundfunktionalität in externe Funktionen/Prozeduren umwandeln, dann könnte der Integer weiterhin ein Record bleiben,
nur läßt sich dieser record dann nicht mehr, wie ein "normaler" Integer, direkt in Formeln verwenden (also nur noch per Prozeduren zu berechnen)

oder als Objekt, aber dann wären wieder die schönen Recordeigenschaften weg
und ebenfalls wäre dieses nicht mehr direkt in Formeln zu verwenden.


vielleicht werd' ich den Nachfolger "TScaleInt" mal in eine alternative Klasse umwandeln,
dann ließe diese sich (zwar etwas eingeschränkt) auch in älteren Delphiversionen einsetzen.


@vsilverlord: du kannst dir aber auch ganz einfach mal Turbo Delphi (aka "abgespecktes Delphi 2006") ansehn ... dieses kennt auch die neuen Features



PS: TScaleInt und TBigFloat sind noch nicht fertig
TScaleInt = scalierbarer Integer
- mit allen eigenschaften eines Integers (also auch mit denen des TBigInt)
- dynamische Speicherverwaltung ... größe wächst mit dem Inhalt (wenn es sein muß, bis der RAM platzt)
(maximalgrößen wählbar)
- alle Dezimalstellen sind signifikant
- scalliert wird auf binärebene ... also im Dualsystem (es gibt aber Funktionen um die eingestellten Dualstellen in Dezimalstellen umzurechnen, oder zurück)
- es entspricht also in etwa dem Typ Currency


TBigFloat stellt einen vergrößerten Single/Double/Extended dar und hat demnach auch deren Eigenschaften
  Mit Zitat antworten Zitat
Benutzerbild von vsilverlord
vsilverlord

 
RAD-Studio 2009 Arc
 
#16
  Alt 31. Mai 2008, 19:18
ok danke für die Antwort. Eigentlich möchte ich mein Delphi 7 behalten, aber ich hab jetzt schon so lange an dem Projekt gearbeitet, dass es nicht daran scheitern soll, nur weil ich zu faul bin mir ein anderes Delphi zu holen. Vielleicht lade ich es nur für dieses eine Projekt runter
Volker
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#17
  Alt 2. Jun 2008, 12:31
Zum Glück ist ja TurboDelphi nicht sooo teuer


und die Sache mit TScaleInt kann noch etwas dauern ... häng noch etwas an der Recordvariante fest (und erst wenn es ferig ist, dann leite ich frühestens 'ne Klasse davon ab)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#18
  Alt 22. Jan 2009, 11:57
hatte zwar noch keine Zeit BigInt und Co. fertigzustellen,

aber die Hashfunktionen würden etwas überarbeitet
siehe Beitrag #16 in CRC32 für einzelne Wörter!
- Delphi 2009 Kompatibilität
- als Einzeldatei verwendbar
(Achtung: im ersten Post wurde die Delphi 2009-Änderungen noch nicht geupdatet)
  Mit Zitat antworten Zitat
schwa226
 
#19
  Alt 18. Feb 2010, 07:40
Hi,

ich habe nun hier die "FHash_single" probiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MD5 : ThMD5;
  s : String;
begin

  MD5.Calc('123');

  S := MD5.asHexString;
end;
Bei einem Online-Calc kommt das raus: 202cb962ac59075b964b07152d234b70
Bei D2010: 5fa285e1bebe0a6623e33afc04a1fbd5

Was mache ich falsch?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins
 
#20
  Alt 18. Feb 2010, 08:57
Dein Delphi-String ist Unicode, der Online-Calc benutzt vermutlich ASCII
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz