Laden...

Große Zeitspannen (als TimeSpan?) darstellen

Erstellt von DarkOppa vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.135 Views
Thema geschlossen
D
DarkOppa Themenstarter:in
13 Beiträge seit 2008
vor 13 Jahren
Große Zeitspannen (als TimeSpan?) darstellen

Hallo,

ich habe Probleme mit TimeSpan und sehr großen Integers. Es geht um die Berechnung von benötigter Zeit für ein bestimmtes Passwort und einen BruteForce-Angriff.

Also kann es vorkommen, dass eine Zahl um 10^30 Sekunden in Jahre, Monate, Tage, Stunden, Minuten und Sekunden formatiert werden soll.

Da TimeSpan keine Int64 akzeptiert, weiß ich als Neuling nicht weiter. Eine eigene Methode schreiben fällt schonmal weg.

Habt ihr nen Tipp für mich? 😉

grüße

309 Beiträge seit 2008
vor 13 Jahren

Bist du sicher daß du so große Zeitspannen darstellen musst?
10 ^ 30 Sekunden: das wären 31,7 Trilliarden (!!!) Jahre.

Timespan kann max einen Zeitraum von ca. 29.247 Jahren darstellen.

Bei solchen Größenrodungen zählen hinteren Stellen nicht mehr, brich das ganze auf eine vernünftige Größenrodungen herunter ( ... Milliarden Jahre) und rechne dann damit.

Aber ich glaube ehrlich gesagt das dir die Größenordnungen hier ein bisserl durcheinander geraten sind.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

D
DarkOppa Themenstarter:in
13 Beiträge seit 2008
vor 13 Jahren

Oh, da hab ich wohl die Anzahl der möglichen Kombinationen für BruteForce mit der Zeit verwechselt 😄

Momentan sieht mein Code folgendermaßen aus:

 
//Berechnung
double versuche = Math.Pow(zeichenanzahl, laenge);
string strVersuche = Convert.ToString(versuche);
textBox2.Text = strVersuche.Replace("E+", " * 10^");

//Zeitberechnung 
double PwRate;
int seconds;
PwRate = Convert.ToDouble(textBox3.Text);
seconds = Convert.ToInt32(versuche / PwRate);
TimeSpan zeit = new TimeSpan(0, 0, seconds);
label19.Text = Convert.ToString(zeit.Days);

Allerdings bekomme ich bei kleinen Zahlen (also kein Overflow) immer nur 0 raus. Dasselbe übrigens bei Minuten oder anderen Einheiten. Wo liegt der Fehler?

F
240 Beiträge seit 2006
vor 13 Jahren

Ein cast von double auf int nimmt einfach alle nachkommazahlen weg, somit ist der resultierende int für zahlen kleiner 1 = 0.

Benutze also besser die TimeSpan.FromMilliseconds Methode:


TimeSpan zeit = TimeSpan.FromMilliseconds(versuche / pwRate * 1000);

D
DarkOppa Themenstarter:in
13 Beiträge seit 2008
vor 13 Jahren

Okay, danke das funktioniert. Allerdings hab ich jetzt noch ein Problem, da TimeSpan offensichtlich nicht mit Monaten/Jahren umgehen kann. Ich will das ganze allerdings auch nicht per Hand mit Dividieren durch 30 usw. lösen da ja nicht jeder Monat 30 Tage hat.

Gibts da einen anderen Weg?

edit:
Und wieso krieg ich mit folgender Zeile mit denselben Werten einen Overflow, sobald ich ulong benutze? Das ganze als Decimal liefert auch nix gescheites... Nur Int32 is verlässlich


double versuche = Math.Pow(zeichenanzahl, laenge);
string strVersuche = Convert.ToString(versuche);
 textBox2.Text = strVersuche.Replace("E+", " * 10^");

Overflow mit:


ulong versuche = (ulong) Math.Pow(zeichenanzahl, laenge);

K
142 Beiträge seit 2006
vor 13 Jahren

Hallo!

Welche Werte hast du denn bei dem Überlauf für zeichenlaenge und anzahl verwendet?

Mit double kannst du wesentlich größere Zahlen (MSDN) darstellen als mit ulong(MSDN).

Timespan.MaxValue = Int64.MaxValue: hilft dir also auch nicht weiter.

Eine eigene Methode schreiben fällt schonmal weg.

Warum?

Grüße, Koller.

D
DarkOppa Themenstarter:in
13 Beiträge seit 2008
vor 13 Jahren

Sprichst du von der Overflow-Exception? Da habe ich noch nichts gesetzt, hab ich noch nie verwendet.

Ein bestimmtes Passwort liefert mir 3,95291798759682 * 10^29 Kombinationen. Falls ich weiterhin double als Typ nutze, hab ich ein Problem bei dem TimeSpan-Objekt, da dieses ja nur Int32 akzeptiert. Somit bekomme ich bei Zeile 3 einen Fehler:

Fehlermeldung:
Overflow Exception wurde nicht behandelt.
Der Wert für Int32 war zu groß oder zu klein.

Hinweise zur Fehlerbehebung:
Dividieren Sie nicht durch 0.
Für diese Ausnahme die allgemeine Hilfe aufrufen.

Nochmals mein Code, da ich gerade selbst den Überblick verliere:


            //Berechnung
            double versuche = Math.Pow(zeichenanzahl, laenge);
            string strVersuche = Convert.ToString(versuche);
            textBox2.Text = strVersuche.Replace("E+", " * 10^");

            //Zeitberechnung 
            //ulong years, months, days, hours, seconds;
            double PwRate = Convert.ToDouble(textBox3.Text);
            double seconds = versuche / PwRate;
            TimeSpan time = new TimeSpan(0, 0, Convert.ToInt32(seconds));
           
            listView1.Clear();
            //listView1.Items.Add(Convert.ToString(years) + " Jahre");
            //listView1.Items.Add(Convert.ToString(months) + " Monate");
            listView1.Items.Add(Convert.ToString(time.Days) + " Tage");
            listView1.Items.Add(Convert.ToString(time.Hours) + " Stunden");
            listView1.Items.Add(Convert.ToString(time.Minutes) + " Sekunden");

Wie bereits gesagt, möchte ich eigentlich nur die gesamte Benötigte Zeit in Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden angeben. Ich denke nicht dass ich das als Neuling schon in eine eigene Methode packen kann 😕

K
142 Beiträge seit 2006
vor 13 Jahren

Guten Morgen,

hast du dir die Links in meinen Beitrag mal angeschaut, insbesondere die Wertebereiche der Typen? Oder gibt es da ein grundsätzliches Problem mit dem Begriff "Wertebereich"???

DU KANNST KEINEN DOUBLE-WERT, DER GRÖSSER ALS Int32.MaxValue IST, IN EINE VARIABLE VOM TYP Int32 CASTEN!!!

hab ich ein Problem bei dem TimeSpan-Objekt, da dieses ja nur Int32 akzeptiert

Falsch, Timespan akzeptiert auch Int64-Werte (TimeSpan-Struktur, insbesondere TimeSpan.MaxValue-Feld).

Aber auch das ist für dein Beispiel noch nicht ausreichend. Wie du schon bemerkt hast, kann Timespan auch keine Umwandlung in Monate und Jahre, das kannst du also sowieso nicht verwenden.

Ich denke nicht dass ich das als Neuling schon in eine eigene Methode packen kann 😕

Warum denn nicht? Die Berechnung der möglichen Kombinationen erfolgt doch auch in einer Methode, oder? Das ist doch nur ein bisschen Mathe. Teile den Wert durch 365, teile den Rest durch 30...

Grüße, Koller.

691 Beiträge seit 2007
vor 13 Jahren

Allerdings hab ich jetzt noch ein Problem, da TimeSpan offensichtlich nicht mit Monaten/Jahren umgehen kann. Ich will das ganze allerdings auch nicht per Hand mit Dividieren durch 30 usw. lösen da ja nicht jeder Monat 30 Tage hat.

Das musst du allerdings selber machen. Das hat den Grund, das die Anzahl der Monate zwischen zwei Daten nicht genau definiert ist.
Ich habe dazu gestern was schönes auf StackOverflow gefunden: Difference in months

mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de

Hinweis von herbivore vor 13 Jahren

Alle Fakten liegen auf dem Tisch. Damit solltest du jetzt alleine weiterkommen.

Thema geschlossen