Checksumme über BigDecimal Werte

ARadauer

Top Contributor
Ich habe eine Datenstruktur in der befinden sich ca 200 BigDecimal Werte.
Diese Struktur wird auch in einer Datebank abgelegt. Ich würde jetzt bei einer Neuermittlung der Werte performant herausfinden ob etwas unterschiedlich zu dennen in der Datenbank ist....

Am liebsten wäre es mir wenn ich eine Checksumme über die Werte generieren könnte. Da fehlt mir aber irgendwie der Ansatz. Wie mache ich das am Besten?
 
Zuletzt bearbeitet von einem Moderator:

ARadauer

Top Contributor
anzumerken ist noch dass 2.0 und 2.00 die selbe checksumme haben sollten
im moment fehlt mir der ansatz, wie ich ein big dezimal in ein byte array umwandle..
 
S

SlaterB

Gast
naheliegend ist eine Aufsummierung der Werte, vielleicht mit dem Spass von ArrayList/ String usw., den vorherigen Wert jeweils mit 31 zu multiplizierten,
wobei du dann noch leichter in Bereiche gelangst, bei denen am Ende hohe und kleine Ziffern weit auseinander liegen

kannst du die Wertebereiche etwas einschränken? geht es gleichzeitig um -0.0099, 5, 17.000 und 10^354?

schon nach 4 Zeilen weg von meiner Idee zuvor: bringe jeden Wert auf String-Darstellung a.bbbbbbb^xxx,
davon hashCode(), das dann addieren, mit 31 verschoben, am Ende ein int-Wert, nicht zu genau,
aber eine Checksumme ist ja auch keine exakte Summe, mehr ein Hashcode

Änderungen in der 17. relevanten Stelle einer Zahl werden dabei freilich nicht erkannt..,
wenn dann komplette String-Darstellung wählen, nur eben auf Probleme wie unnötige Nullen achten,
also das richtige DecimalFormat verwenden (für aufwendige Kürzung auf genau a.bbbbbbb^xxx fällt mir schon wieder gar kein Grund ein)


steht wohl nur noch dein kleines Wörtchen 'performant' im Weg? ;)
 
Zuletzt bearbeitet von einem Moderator:

ARadauer

Top Contributor
Ja ich kann den Werte Bereich einschränken... geht von 1.000.000 bis 0.001
Aufsummierung ist halt auch so eine Sache..
1000
200
300
ist was anderes als
1200
100
200

Im Moment verfogle ich den Ansatz, dass ich die BigDecimal in BigInteger wandle, diese in ein byte[] array umwandle und dann daraus einen MD5 Hash erzeuge...

Ist ok für mich da es mir egal ist ob
10.1 oder 10.10001

Java:
public class CheckSumHelper {

    private static String algorithm = "MD5";
    private static BigDecimal multiplyToInteger = new BigDecimal("1000");

    public static BigInteger calcCheckSum(List<BigDecimal> values) throws IOException, NoSuchAlgorithmException {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for (BigDecimal value : values) {
            baos.write(toByte(value));
        }
        
        baos.close();
        MessageDigest m = MessageDigest.getInstance(algorithm);
        m.update(baos.toByteArray());
        return new BigInteger(1, m.digest());
    }

    public static byte[] toByte(BigDecimal v) {
        return v.multiply(multiplyToInteger).toBigInteger().toByteArray();
    }
}
 
S

SlaterB

Gast
Ja ich kann den Werte Bereich einschränken... geht von 1.000.000 bis 0.001
Aufsummierung ist halt auch so eine Sache..
1000
200
300
ist was anderes als
1200
100
200
dagegen soll sicher das *31 etwas helfen,
kommt allgemein vielleicht auch darauf an, wie wahrscheinlich das ist, ob das eine die Differenz von 2 anderen Werten ist usw.,
ob mehrere Werte im Bereich von 1000-1500 schwanken usw.

theoretisch kann man auch genau beim besten Hashcode das Problem haben,
dass der eine sich
von 49054389088 auf 49054399088 ändert und der andere
von 544847598 auf 544837598

in der Summe dann.., wobei eben wieder *31

(edit: ok, schlechtes Beispiel bei der so viele Stellen des Hashcodes gleich bleiben, aber theoretisch auch gleiche Summen denkbar)

-------

gegen MD5-Aufwand kann doch toString(), mit DecimalFormat ohne 2.00, und hashCode() darauf nicht viel schlechter sein?
oder zu wenig Stellen mit int-Wertebereich?
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Wenn es hier um eine Prüfsumme zur Erkennung von Datenfehlern und nicht um kryptograhische Anforderungen geht, warum dann nicht einfach bei den HashCodes von Java bleiben? BigDecimal hat selbst eine hashCode()-Methode (nicht sehr überraschend). Die ist so einigermaßen geeignet, dass bei unterschiedlichen Werten unterschiedliche einzelne HashCodes rauskommen. Für die "Aufsummierung" würde ich auch Standardmechanismen nutzen. Wenn Deine "Datenstruktur" ein Array ist, wäre Arrays.hashCode(...) passend. Wenn sie eine Implementierurng einer Collection ist, deren hashCode()-Methode. Zumindest bei den Klassen des JDK (ArrayList, HashSet etc.) werden die Elemente berücksichtigt. Mein Vorschlag läuft also letztlich auf etwas sehr einfaches hinaus:
Bei Arrays speicher das Ergebnis von Arrays.hashCode(...)
Bei Collections speicher das Ergebnis des hashCode-Aufrufs auf der Collection.
 
S

SlaterB

Gast
Returns the hash code for this BigDecimal. Note that two BigDecimal objects that are numerically equal but differ in scale (like 2.0 and 2.00) will generally not have the same hash code.
war im zweiten Posting noch als direkt schlecht angesprochen und der Anfang zu anderen Lösungen,
das müsste man etwas umschiffen wenn wirklich wichtig,
temporär String in guten Format oder neue BigDecimal mit einheitlichen Scale
 
N

nillehammer

Gast
SlaterB hat gesagt.:
war im zweiten Posting noch als direkt schlecht angesprochen und der Anfang zu anderen Lösungen,
das müsste man etwas umschiffen wenn wirklich wichtig
Tatsache! Und in dem Post sogar genau die Zahlen aus dem Javadoc-Code verwendet. Da hätte ich ja mal reinschauen könnnen! Sorry für den unnötigen Post.

[EDIT]Tja, dann würde ich mir für alle BigDecimals mit toString oder toPlainString die String-Repräsentationen holen, sie in einem String-Array speichern und dann Arrays.hashCode(...). Warnung: Ich habe auch bei den toString/toPlainString nicht nachgeschaut, ob da irgendwas anderes nicht passt. Bitte nicht hauen :([/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Timothy Truckle

Top Contributor
Ich habe eine Datenstruktur in der befinden sich ca 200 BigDecimal Werte.
Diese Struktur wird auch in einer Datebank abgelegt. Ich würde jetzt bei einer Neuermittlung der Werte performant herausfinden ob etwas unterschiedlich zu dennen in der Datenbank ist....

Am liebsten wäre es mir wenn ich eine Checksumme über die Werte generieren könnte. Da fehlt mir aber irgendwie der Ansatz. Wie mache ich das am Besten?
Die Vorschläge der Kollegen sind ja alle ganz nett, aber "performant heist do wohl, dass der selbe Check in der DB läuft, damit die großen Zahlen nicht erst übertragen werden müssen. Wenn ist die sowieso erst aus der DB holen muss brauche ich doch den Check nicht mehr...

Also Ich würde die die Klasse [JAPI]CRC32[/JAPI] bemühen, die ist nämlich genau dafür da....

bye
TT
 
N

nillehammer

Gast
Also Ich würde die die Klasse CRC32 bemühen, die ist nämlich genau dafür da....
Sehr gute Idee, ein Standardisierter Algorithmus. Erhöht die Chance, dass die DB das auch unterstützt. Wir haben nur alle noch nicht rausgefunden, wie man aus einem BigDecimal ein byte-Array macht.

Außerdem muss die DB es doch garnicht berechnen. Bei jedem Abspeichern kann doch der von Java berechnete Wert mit gespeichert werden. Beim nächsten Select dann vorher ausgelesen werden.
 
S

SlaterB

Gast
soll der Link
CRC32 (Java Platform SE 7 )
allein dem Stichwort CRC32 dienen, falls in DB, oder tatsächlich Bytes in Java bearbeiten?

in jedem Fall ist zu bedenken, dass hoffentlich auf 2.0 vs. 2.00 geachtet wird (sofern das immer noch wichtig ist, man kann das nur einschränkend wiederholen),
irgendwo muss diese Info ja stecken, schon fraglich ob sie überhaupt in der DB als Unterschied gespeichert wird,
aber vielleicht in den neu erstellten Vergleichsdaten in Java,

wenn man nur bytes vergleicht, macht diese Information wohl einen Unterschied,
es braucht eine inhaltsbasierte Interpretation

edit: die Checksumme der Werte in der DB wird wohl beim Speichern eh berechnet, mitgespeichert oder im Programm vorgehalten, in der DB muss womöglich nichts berechnet werden
 
Zuletzt bearbeitet von einem Moderator:

Timothy Truckle

Top Contributor
soll der Link
CRC32 (Java Platform SE 7 )
allein dem Stichwort CRC32 dienen, falls in DB, oder tatsächlich Bytes in Java bearbeiten?
Ich kenne noch einen: 12.6.2. Mathematical Functions

in jedem Fall ist zu bedenken, dass hoffentlich auf 2.0 vs. 2.00 geachtet wird (sofern das immer noch wichtig ist, man kann das nur einschränkend wiederholen),
irgendwo muss diese Info ja stecken, schon fraglich ob sie überhaupt in der DB als Unterschied gespeichert wird,
Oracle würde das wohl von der Definition des Feldes abhängig machen...

bye
TT
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
AssELAss Best Practice Checksumme über jede Spalte zweier Tabellen und vergleichen Allgemeine Java-Themen 3
reibi Checksumme für ein File berechnen Allgemeine Java-Themen 12
foobar Checksumme in C++ Allgemeine Java-Themen 9
kodela Datenübergabe über Buttons Allgemeine Java-Themen 8
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
A ByteArray über Socket Allgemeine Java-Themen 3
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
I OpenPDF erzeugt riesige PDFs, wenn Grafiken über PdfGraphics2D#drawImage gezeichnet werden Allgemeine Java-Themen 1
T Etikettendrucker über TCP-IP Allgemeine Java-Themen 1
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
L Aufwandsabschätzung: Android-App Aufnahmefunktion (foto) und zweiter Ebene über dem Foto (teiltransparent) Allgemeine Java-Themen 6
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
david19 Software AE über Domain laufen lassen Allgemeine Java-Themen 0
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
K Auf Dateiverzeichnis extern zugreifen (evtl über XML??) Allgemeine Java-Themen 22
C VisualVM oder Jconsole über Jolokia-Proxy Allgemeine Java-Themen 0
G USB-Pins über Java ansteuern Allgemeine Java-Themen 8
Ernesto95 Best Practice Localization über ResourceBundle Allgemeine Java-Themen 6
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
C Auslesen auslösen über Button-Click Allgemeine Java-Themen 8
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
kodela Eigenartige Datumsberechnung über GregorianCalendar Allgemeine Java-Themen 15
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
T .jar über cmd ausführen (später dann batch) Allgemeine Java-Themen 6
F In OSX: Java-Programm über URI-Scheme aufrufen mit Parameter? Allgemeine Java-Themen 0
C Input/Output Zip Files über Socket senden und empfangen Allgemeine Java-Themen 6
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
L Videodateien über Java öffnen unabhängig vom Format Allgemeine Java-Themen 4
Thallius Hash über serialisiertes Objekt? Allgemeine Java-Themen 3
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
F Content-Disposition ermitteln über URL Allgemeine Java-Themen 2
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
S VLC + Lied über Java starten Allgemeine Java-Themen 17
M HTML-Code von Webseite über Browser oder Console auslesen?? Allgemeine Java-Themen 5
A Sinuston ausgeben und über Mikro Amplitude messen – machbar? Allgemeine Java-Themen 6
R Java-Progamm über Icon starten unter Windows Allgemeine Java-Themen 9
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
aze Jar ausführen über Runtime.execute funktioniert nicht Allgemeine Java-Themen 4
S NoSuchMethodError beim Ausführen einer C Methode über JNI Allgemeine Java-Themen 5
H OOP Daten über TCP Allgemeine Java-Themen 5
Pastafari Iterator über nested HashMaps Allgemeine Java-Themen 7
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
G Interface Laden der Konfiguration über Interfaces sinnvoll? Allgemeine Java-Themen 28
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
B VoIP-Gespräche über Computer führen Allgemeine Java-Themen 3
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
C Java Programm über SSH starten Allgemeine Java-Themen 16
K Internetverbindung über PuTTy herstellen?! Allgemeine Java-Themen 9
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
G Auf Kommandozeile über Processobjekt mit Outputstream Allgemeine Java-Themen 3
S Input/Output Binärdatei über Bytestreams Allgemeine Java-Themen 4
S Kommunikation von Core und GUI über Schnittstellen Allgemeine Java-Themen 2
J Explorer über Code starten Allgemeine Java-Themen 15
kodela Problem mit Kopieren über FileChannel Allgemeine Java-Themen 4
L Java und Javascript um Distanz über Google Maps zu berchnen Allgemeine Java-Themen 10
B UNIX Shell befehl über JavaCode ausführen Allgemeine Java-Themen 19
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
M Ampelsteuerung über Timer in Java realisieren Allgemeine Java-Themen 3
L CMD über Java öffnen Allgemeine Java-Themen 8
U Mailclient über getDesktop.mail vorbereiten, Problem beim Anhang: Allgemeine Java-Themen 3
R Klasse über Button Event in anderer Klasse informieren Allgemeine Java-Themen 11
R Frequenzausgabe (2 Kanal) über Lautsprecherausgang Allgemeine Java-Themen 22
J Java-Klasse über Konsole starten Allgemeine Java-Themen 6
E FF Einstellungen über Programm ändern? Allgemeine Java-Themen 7
D JVM kann nicht über die jvm.dll gestartet werden? Allgemeine Java-Themen 1
S File im windowexploer öffnen über java Allgemeine Java-Themen 6
J Receive eines Hex-Bytes über COM-Port Allgemeine Java-Themen 4
Nicer Prozess über Prozessnamen beenden Allgemeine Java-Themen 15
reibi File über FileChannel locken Allgemeine Java-Themen 5
B Serialisierung mit Unterobjekten über Netzwerk Allgemeine Java-Themen 3
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
B parallele / Multithreaded Iteration über Map Allgemeine Java-Themen 12
D Unix/Linux Benutzer-Authentifikation über Java Allgemeine Java-Themen 3
M Tastatur eingabe über Buttons Allgemeine Java-Themen 15
S GPS-Maus über USB ansprechen Allgemeine Java-Themen 8
reibi Files über Classpath laden Allgemeine Java-Themen 22

Ähnliche Java Themen

Neue Themen


Oben