Algorithmus gesucht 2 Zahlen in 1 Feld zus.ziehen

Hallo,

ich benötige für folgendes EDV-Problem einen Algorithmus:

Die Werter von zwei Feldern einer Tabelle, beide numerisch, eines mit 10, das andere mit 6 Stellen sollen in EIN 10-stelliges Character-Feld eindeutig überführt werden.
D.h. egal welche Werte/Kombinationen in den beiden Feldern stehen, ich muß immer einen eindeutigen Schlüssel erhalten!
Beispiel:

Feld 1: 9768956781
Feld 2: 120789

Ergebnis: Aa45c56CFR

Eine Rückauflösung ist nicht erforderlich!
Das Ganze soll UNICODE fähig sein.

Irgendwelche Ideen, gern auch Hinweise auf weitere Foren, wo ich die Frage platzieren könnte

Danke
Andreas

Hi,
warum legst du nicht beide Zahlen zusammen (ggf mit Nullen vorne erweitern):
3860283534
0000236914

=> 30/80/60/00/…

Ergebnis: Zahl mit 10 Stellen mit Basis 100. Dann such dir einfach deine 100 Lieblings-Ascii oder Unicode-Zeichen, und fertig. (zB Ascii-Codes von 32=„00“ bis 131=„99“ oder so)

Gruß,
mauschu

Hallo Markus,

danke für den Tipp, hätte ich auch selbst drauf kommen können, aber wenn man zu intensiv Alternativen sucht, fällt einem das einfache nicht ein :smile:.

Programmiertechnisch macht sich gerade ein Kollege ein paar Gedanken zu Deinem Vorschlag!

Gruß
Andreas

Hallo

Die Werter von zwei Feldern einer Tabelle, beide numerisch,
eines mit 10, das andere mit 6 Stellen sollen in EIN
10-stelliges Character-Feld eindeutig überführt werden.
D.h. egal welche Werte/Kombinationen in den beiden Feldern
stehen, ich muß immer einen eindeutigen Schlüssel erhalten!
Beispiel:

Feld 1: 9768956781
Feld 2: 120789

Ergebnis: Aa45c56CFR

Also, Du hast 16 Stellen mit je 10 möglichen „Zeichen“,
also einen 10^16 - Raum.

Nehmen wir an, Du bildest diesen Raum mit den
64 gängigsten ASCII-Zeichen (A-Z,a-z,0-9,_-) ab,
also in einem 64^L - Raum.

Dann brauchst Du gar keine 10 Ascii-Zeichen,
es würden auch 9 schon tun. 8 wären aber zu
wenig:

 64^8 = 281474976710656
 10^16 = 10000000000000000
 64^9 = 18014398509481984
 64^10 = 1152921504606846976

Die ganze Prozedur wäre also ein simples
Mapping Deiner Zahl aus dem [0…9]-Raum
in den [0…63]-Raum, also praktisch eine
reine Konvertierung innerhalb von Zahlensystemen.

Ich glaube, C hat sowas sogar als vordefinierte Funktion,
da muss man dann gar nichts weiter machen, als die
resultierenden Ziffern aus dem 64-System als Indices
in die (eigene) Tabelle mit den gewünschten 64 ASCII-Zeichen
zu verstehen.

Grüße

CMБ

Die ganze Prozedur wäre also ein simples
Mapping Deiner Zahl aus dem [0…9]-Raum
in den [0…63]-Raum, also praktisch eine
reine Konvertierung innerhalb von Zahlensystemen.

Da ich gerne programmiere, hab ich das mal
versucht - und ich denke es geht so. Man
korrigiere mich bitte, ich lerne gern dazu :wink:

Perl hat ein schönes Modul „Math::BaseArith“,
um zwischen Zahlensystemen umzuwandeln. Die
ganze Umwandlung ist dann hier:

— map16_10.pl —

use strict;
use warnings;
use Math::BaseArith;

my @ascspace = ('A'..'Z', '0'..'9', '-', '\_', 'a'..'z');
my $R = scalar @ascspace; # $R ist Anzahl der ASCII-Zeichen

my @tab = ( ['9768956781', '120789'], # diese Zahlenpaare umwandeln
 ['6292937814', '574747'],
 ['0000000001', '000001'],
 ['9999999999', '999999'] );

for my $ze (@tab) { # über die Tabelle gehen
 my $num = $ze-\>[0] . $ze-\>[1]; # aus 10 + 6 wird 16-stell. Zahl
 my @parts = $num=~/(.{8})(.{8})/; # diese zerlegt in zwei 8-stell. Z.
 my @idx = map { encode $\_, [$R, $R, $R, $R, $R] } @parts; # umwandeln
 my $cod = join '', map { $ascspace[$\_] } @idx; # die Indices in die ASCII
 print "$ze-\>[0] | $ze-\>[1] ==\> $cod \n"; # Tabelle mappen + ausgeben
}

Hierbei zerlege ich die 16-stellige Zahl
in zwei 8-stellige, da ich die Probleme
mit 64bit-int auf 32bit-Systemen damit
umgehe, die Ausgabe ist:

 9768956781 | 120789 ==\> Fodz5Ep2sV 
 6292937814 | 574747 ==\> DkDb8AraS1 
 0000000001 | 000001 ==\> AAAAAADoJB 
 9999999999 | 999999 ==\> Fx4DzFx4Dz 

Vielleicht nützt das ja
als Anregung :wink:

Grüße

CMБ

Hallo Markus,

3860283534
0000236914
=> 30/80/60/00/…

Ergebnis: Zahl mit 10 Stellen mit Basis 100. Dann such dir
einfach deine 100 Lieblings-Ascii oder Unicode-Zeichen, und
fertig. (zB Ascii-Codes von 32=„00“ bis 131=„99“ oder so)

Mit 100 verschiedenen ASCI-Codes brauchst Du
exakt 8 Stellen (und nicht 10), um 16 Stellen
mit je 10 verschiedenen ASCII-Codes (0…9) ab-
zubilden, denn:

 10^16 = 10000000000000000
 100^8 = 10000000000000000

(Allerdings klappt das nicht
mit Deiner Methode)

Grüße

CMБ

Mit 100 verschiedenen ASCI-Codes brauchst Du
exakt 8 Stellen (und nicht 10), um 16 Stellen
mit je 10 verschiedenen ASCII-Codes (0…9) ab-
zubilden, denn:

10^16 = 10000000000000000
100^8 = 10000000000000000

(Allerdings klappt das
nicht
mit Deiner Methode)

Wär ich nie drauf gekommen dass ich mit den 4 0-en was verschenke

Hallo MArkus,

(Allerdings klappt das nicht mit Deiner Methode)

Wär ich nie drauf gekommen dass ich mit
den 4 0-en was verschenke

Ehrlich gesagt habe ich Deine Denkweise bei obigem
Problem nicht verstanden, ausserdem halte ich die
Idee „nimmt doch mal aus 100 ASCII-Zeichen“ für
etwas ungünstig, da die üblichen 62 bzw 85
(mit Punktion u. Klammern) Zeichen mehr als
ausreichen.

Und wenn schon, warum bei 3860283534/236914

 3860283534
 0000236914 =\> 30/80/60/00/... ==\> 10 Zeichen

und nicht einfach

 38/60/28/35/34/23/69/14 ==\> 8 Zeichen bereits vorhanden

so dass man eigentlich gar nichts
zu berechnen braucht, da kann man auch
noch das Kürzel (XY) des Bearbeiters
unterbringen.

Oder habe ich die eigentliche Aussage
Deines Postings krass missverstanden?

Grüße

CMБ

=> 30/80/60/00/…

Privet Semjon,

ich wollte damit nur sagen dass man einfache Dinge auch kompliziert machen kann. Natürlich kann man statt der führenden vier Nullen genauso gut so zusammenfassen:
2463625842
____275683

==> 24/63/62/27 etc, dann hast du auch deine 8 Paare statt 10. Bei 100 Zeichen ist das dann optimal ohne Redundanz codiert. Ich glaube aber nicht dass es in dem geschilderten Problem besonders dramatisch darauf ankommt, ob man nun auf Basis von 100 oder von 64 Zeichen arbeitet. Ich gebe Dir Recht, dass wenn man auf 10 Stellen besteht und minimal viele Zeichen benutzen möchte, man es effizienter (dafür auch nicht mehr so trivial nachvollziehbar) codieren kann.

Viele Grüße
mauschu