Prüfsumme?

hans

Mitglied
Ich habe ein Eingabefeld dort wird eine Name eingegeben. Wie kann man eine Prüfsumme erstellen, damit man Prüfen kann, ob der Name bei wiedereingabe der Gleiche ist. Die Prüfsumme sollte sehr kurz sein und wird gespeichert. Der Name kann nicht gespeichert werden?

gibt es dafür eine Lösung?
 
F

Firephoenix

Gast
Eine kurze Prüfsumme wäre der hashCode des Strings oder eine eigene ähnliche Funktion.
Hier hast du allerdings auch die Gefahr, das andere Namen den gleichen Hashcode produzieren könnten, aber das Problem wirst du generell bei kurzen Prüfsummen haben.
Gruß
 
G

Gast2

Gast
Er wollte wohl damit ausdrücken, dass Gert und Gertrud dieselbe Prüfsumme hätten... fail :joke:

Naja, aber sowas lässt sich nicht vermeiden. Man hat mit drei Zeichen nunmal einen sehr viel kleineren Wertebereich. Es wird immer mehr Namen als Prüfsummen geben, das wird zwangsläufig irgendwann kollidieren.

Es gibt aber auf jeden Fall bessere Prüfsummen als einfach nur die ersten drei Buchstaben zu nehmen, damit schränkt man sich den Wertebereich ja nochmal ein. Niemand wird wohl
Code:
f8z
heißen.
 

Bernd Hohmann

Top Contributor
CRC16 (wirft ein 2byte Integer aus). Basiert auf CRC16-CCITT (Poly: 0x1021).

Code:
public class CRC16 {

	private int intCRC16 = 0x0;

	public static void main(String[] args) {
		String test = "Hallo Welt";
		CRC16 cc = new CRC16();
		cc.update(test.getBytes());
		System.out.println(cc.getCRC());
		cc.reset();

	}

	public int update(byte b[]) {
		for (int i = 0; i < b.length; i++) {
			update(b[i]);
		}
		return intCRC16;

	}

	public int update(byte b) {
		int intA = b;
		int intB = 0;

		for (int i = 7; i >= 0; i--) {
			intA = intA << 1;
			intB = (intA >>> 8) & 1;
			if ((intCRC16 & 0x8000) != 0) {
				intCRC16 = ((intCRC16 << 1) + intB) ^ 0x1021;
			} else {
				intCRC16 = (intCRC16 << 1) + intB;
			}
			intCRC16 = intCRC16 & 0xffff;
		}
		return intCRC16;
	}

	public int getCRC() {
		return intCRC16;
	}

	public void reset() {
		intCRC16 = 0;
	}

}
 
T

TryToHelp

Gast
Achso, ja wenn er das so meint, ja das stimmt, aber das lässt sich nicht vermeiden, wenn man einen eintrag kürzen will. Wenn ich nunmal nicht mehr alle Informationen habe wird es schlechter, kann man machen nix.

Andere Variante wäre einfach die Werte der ersten 10 Buchstaben zu addieren, ab auch das ist keine sichere Lösung

a=1
b=2
...
z=26

klaus
11+12+1+21+19=64 (kleiner als 3 Zeichen)
tttd
20+20+20+4=64

klaus=tttd
 

ssoul26

Bekanntes Mitglied
Schnell und dreckig:) Habs nicht total getestet sollte aber weitestgehend unter 3 Zeichen bleiben, hmmm :)
Java:
   public static String Pseudo(String name) {
      int xx = 0;
      char[] c = name.toCharArray();
      for (int i = 0; i < c.length - 1; i++) {
         char c1 = c[i];
         char c2 = c[i + 1];
         if (c1 > c2) {
            xx += c1 + c2;
         } else {
            xx += c1 - c2;
         }
      }
      xx += c[c.length - 1];
      xx = xx / name.length();
      return String.valueOf(xx);
   }
 
B

bone2

Gast
Die höchste genauigkeit erhält man dann wohl mit CRC24, macht 3 byte prüfsumme, 16.7 mio möglichkeiten

Java:
    public static void main(String[] args) throws IOException {
        CRC24 crc = new CRC24();
        byte[] bytes = "Hahaha Blablabiag".getBytes();
        crc.update(bytes);
        System.out.println(crc.getValue()+ " " + Arrays.toString(crc.toByteArray()));
    }

Java:
import java.nio.ByteBuffer;

import com.sun.org.apache.xml.internal.security.utils.Base64;

/**
 * A class that can be used to compute the CRC-24 of a data stream.
 *
 * @author <a href="mailto:nagydani@users.sourceforge.net">Daniel A. Nagy</a>
 */
public final class CRC24 implements java.util.zip.Checksum {
    final static int INIT = 0xb704ce;
    final static int POLY = 0x1864cfb;
    private int crc;

    /**
     * Creates a new CRC24 object.
     */
    public CRC24() {
    }

    /**
     * Creates a copy of a CRC24 object.
     *
     * @param c
     *            object to be copied
     */
    public CRC24(CRC24 c) {
        crc = c.crc;
    }

    /**
     * Returns CRC-24 value.
     */
    public long getValue() {
        return crc & 0xffffff;
    }

    /**
     * Resets CRC-24 to initial value.
     */
    public void reset() {
        crc = INIT;
    }

    /**
     * Updates CRC-24 with specified byte.
     *
     * @param b
     *            the byte to update the checksum with
     */
    public void update(int b) {
        int i = 8;
        crc ^= b << 16;
        while (i-- > 0) {
            crc <<= 1;
            if ((crc & 0x1000000) > 0)
                crc ^= POLY;
        }
    }

    /**
     * Updates CRC-24 with specified array of bytes.
     *
     * @param b
     *            the byte array to update the checksum with
     * @param off
     *            the start offset of the data
     * @param len
     *            the number of bytes to use for the update
     */
    public void update(byte[] b, int off, int len) {
        int i;
        int end = off + len;
        for (i = off; i < end; i++)
            update(b[i]);
    }

    /**
     * Updates CRC-24 with specified array of bytes.
     *
     * @param b
     *            the byte array to update the checksum with
     */
    public void update(byte[] b) {
        update(b, 0, b.length);
    }

    /**
     * Armor Checksum
     *
     * @return Base64 representation prefixed by '='
     */
    public String toString() {
        byte[] c = { (byte) ((crc >> 16) & 0xff), (byte) ((crc >> 8) & 0xff),
                (byte) (crc & 0xff) };
        return "=" + Base64.encode(c);
    }

    /**
     * Returns byte array representation of CRC-24 value
     *
     * @param value
     * @return
     */
    public byte[] toByteArray() {
        ByteBuffer bb = ByteBuffer.allocate(4);
        byte[] ba = bb.putInt(crc).array();
        return new byte[] {ba[1], ba[2], ba[3]};
    }
}


[EDIT]beispiel mit oben genannten namen[/EDIT]
Java:
    public static void main(String[] args) throws IOException {
        String[] namen = {"Gertrud", "Gert", "Karl", "Ina", "klaus", "tttd"};

        for (String name : namen) {
            printCRC(name);
        }
    }

    public static void printCRC(String name) {
        CRC24 crc = new CRC24();
        byte[] bytes = name.getBytes();
        crc.update(bytes);
        System.out.println(crc.getValue()+ " " + Arrays.toString(crc.toByteArray()) + " " + new String(crc.toByteArray()));
    }
Code:
3245734 [49, -122, -90] 1†¦
8828647 [-122, -74, -25] †¶ç
9087013 [-118, -88, 37] Š¨%
1992713 [30, 104, 9] h	
6217530 [94, -33, 58] ^ß:
7244855 [110, -116, 55] nŒ7
strings sehen print etwas komisch aus, aber wenn man sie irgendwo binär in einer db oder datei speichert passt das
 
Zuletzt bearbeitet von einem Moderator:

JDKarl

Mitglied
fast unmöglich. mit 3 zeichen eine Prüfsume zu erstellen.
OK ich versuche es:

Du rechnest die Stelle für jeden Buchstaben den er im Alphabet hat zusammen.

S = 19
i = 9
m = 13
o = 15
n = 14

Simon = 80

Dann rechnest du 999 minus deine zahl

999 - 80 = 989

dann ziehst du den wert deines ersten Buchstabend den zehner der vorher errechneten zahl ab

989 = 98 9
98 -19 = 79 9

Deine Checksumme ist nun für Simon ist 799.


Bei plus minus opperatoren kann es natürlich sein dass 2 namen auf die gleiche Prüfsumme kommen.
War grad nur ein schnelles Gedankenexperimemnt.

mfg

JDKarl
 
B

bone2

Gast
fast unmöglich. mit 3 zeichen eine Prüfsume zu erstellen.
naja crc24 deckt schon ne menge ab und ist um welten genauer als so händisches char nummern addieren.

will man auf lesbare zeichen hin und nimmt dann ein auf 64 zeichen basierendes zahlensystem (0-9, a-z, A-Z, ".;:_/*-+") bekommt man immerhin noch 262k verschiedene prüfsummen hin
 
T

TryToHelp

Gast
Ja das schon, aber es garantiert es auch nicht, ok, die Wahrscheinlichkeit ist geringer und deswegen auch zu bevorzugen ;-)
 
B

bone2

Gast
garantieren ist so ne sache :) bei geforderten 3 byte hat man eben nur 16.7 mio möglichkeiten. die nutzt 24er crc sauber aus.
wenn man es auf mensch lesbare bytes beschränken will/muss, ist es immernoch besser auf nen höheres zahlensystem zurückzugreifen als einfach nur nen dezimal.tostring() zu nehmen und nur noch 1000 möglichkeiten zu haben. schon hex ist 4mal so gut wie reines 0-9
 
S

Spacerat

Gast
hex ist 4mal so gut wie reines 0-9
Also zwischen HEX und BCD komme ich blos auf einen Faktor von 1,6, aber trotzdem dürfte HEX in die richtige Richtung führen.
Man kann ja auch den String blockweise Summieren (immer drei Zeichen addieren) und das Ergebnis auf 24 Bit maskieren, dabei kann man evtl. sogar noch jeweils die Stelle an welcher das Zeichen oder der Block im String steht mit einbeziehen.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben