Gut ich hab die Lösung auch soweit... Muss sie noch in PHP umsetzen
Programmieraufgabe zur Nacht
Einklappen
X
-
edit: lasst euch doch auch mal was von nem jüngeren gesagt sein^^ Hashs zurückrechnen generell nicht eindeutig möglich^^
Ich habs kurz für bis zu 9 Zeichen gemacht, wie das darüber hinaus geht, schau ich mir morgen an.Assembler ist eine Methode,
Programme, die zu langsam laufen,
so umzuschreiben,
dass sie überhaupt nicht mehr laufen.
Kommentar
-
also bis 9 zeichen ists ja einfach, aber dann... keine ahnung mehr
Kommentar
-
Ich hab auch nie gesagt, dass die Hashes zurückgerechnet werden sollen, sondern der Algorithmus. Das erstmal für die Besserwisser. Darüberhinaus ist der Algorithmus auch nicht besonders gut.
Kleiner, nicht geplanter Tipp: Ich hab hier schonmal einen Hash-Algorithmus gepostet, der jetzige arbeitet sehr ähnlich. Wenn auch mit ein zwei entscheidenden Unterschieden.
@Schanz: Ich frag mich, wie du die Lösung haben willst, ohne diese implementiert zu haben?! Wie hast du das getestet?
Kommentar
-
Original geschrieben von unset
Ich hab auch nie gesagt, dass die Hashes zurückgerechnet werden sollen, sondern der Algorithmus. Das erstmal für die Besserwisser. Darüberhinaus ist der Algorithmus auch nicht besonders gut.
Kleiner, nicht geplanter Tipp: Ich hab hier schonmal einen Hash-Algorithmus gepostet, der jetzige arbeitet sehr ähnlich. Wenn auch mit ein zwei entscheidenden Unterschieden.
@Schanz: Ich frag mich, wie du die Lösung haben willst, ohne diese implementiert zu haben?! Wie hast du das getestet?
WIE ich das dann hinbekommen habe erzähl ich wenn es soweit ist (oder auch nicht)
// Edit: BLAAAAAAAA ich liege KOMPLETT Falsch...
Ich höre auch auf jetzt ^^ Ich komme leider nicht drauf :P Vieleicht setz ich mich heute Nacht nochmal dran .... Vieleicht hilft das was ich habe jemandem weiter:
PHP-Code:<?php
if(!isSet($_GET['string']) || empty($_GET['string'])) die();
/*
** Konvertiert ein Zeichen in den Code
** Zuerst wird der ermittelte ASCII Wert des Zeichens durch 9 geteilt!
** Sollte das Ergebniss keine Nachkommastellen haben ist die Code "9", andernfalls traegt der den Wert der 1. Nachkommastelle
*/
function chrToCrypt($chr)
{
$code = ord($chr)/9;
$code = is_int($code) ? "9" : substr($code, (strpos($code, ".")+1), 1);
return $code;
}
/*
** Konvertiert einen String in einen Hash-Code
** Wie genau muesst ihr euch schon selber ansehen
*/
function cryptString($str)
{
// Der String wird alle 9 Zeichen 'geteilt' und in ein Array geschrieben
$splitted = str_split($str, 9);
// Ein String mit 10 Zeichen wuerde 2 Arrays fuellen, das 2. jedoch nur mit einem Zeichen
// Daher wird das letzte Array 'aufgefuellt' und zwar indem der String wiederholt wird
$entry = count($splitted)-1;
$splitted[$entry] = substr(str_repeat($splitted[$entry], 9), 0, 9);
// Nun wird jeder einzelne Buchstabe durch die entsprechende Code Ziffer ersetzt
foreach($splitted as $string)
{
$cplstring = "";
for($i=0;$i<=8;$i++)
{
$chr = substr($string, $i, 1);
$cplstring .= chrToCrypt($chr);
}
$crypted[] = $cplstring;
}
return $crypted;
}
print_r(cryptString($_GET['string']));
?>Zuletzt geändert von Schanz; 04.07.2008, 20:35.
Kommentar
-
Hallo,
hier ist der Algorithmus:
Testen: http://blacksoul.redio.de/phpr/unset...p?string=HALLO
PHP-Code:<?php
function cryptbis9($string){
$crypted = "";
for($i=0;$i<strlen($string);$i++){
$sign = ord($string{$i}) % 9;
$sign = ($sign == 0) ? 9 : $sign;
$crypted .= $sign;
} // for
if(strlen($crypted) < 9) $crypted = substr(str_repeat($crypted,9),0,9);
return $crypted;
} //cryptbis9
function cryptab10($string){
$crypted = "";
$tupellength = floor((strlen($string) / 9)+1);
if(floor(strlen($string)/$tupellength) < 9){
$addstring = (((9 - floor(strlen($string)/$tupellength)) * $tupellength)-(strlen($string)%$tupellength));
$string .= substr($string,0,$addstring);
} //if
for($i=0;$i<(strlen($string)/$tupellength);$i++){
$zcrypted = 0;
$k = $i*$tupellength;
for($j=0;$j<$tupellength;$j++){
$sign = ord($string{($k+$j)}) % 9;
$sign = ($sign == 0) ? 9 : $sign;
$zcrypted += $sign;
} //for
$zcrypted = $zcrypted % 9;
$zcrypted = ($zcrypted == 0) ? 9 : $zcrypted;
$crypted .= (string) $zcrypted;
} //for
if(strlen($crypted) < 9) $crypted = substr(str_repeat($crypted,9),0,9);
return $crypted;
} //cryptab10
if(isset($_GET['string'])) echo (strlen($_GET['string']) > 9) ? cryptab10($_GET['string']) : cryptbis9($_GET['string']);
?>
Kommentar
-
@unset, meintest du diesen post aus dem Forum JavaScript:
PHP-Code:function hash(Source) {
var HashBase = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
var WorkingSource = Source;
var Hash = '';
var Counter = 0;
while((WorkingSource.length % 32) != 0) {
if(Counter > WorkingSource.length) {
Counter = 0;
}
WorkingSource = WorkingSource + WorkingSource.substr(Counter, 1);
Counter++;
}
while((WorkingSource.length % 32) != 0) {
WorkingSource = WorkingSource.substr(0, WorkingSource.length - 1);
}
var CharsPerPart = WorkingSource.length / 32;
for(var i = 0; i < 32; i++) {
var SubPart = WorkingSource.substr(i*CharsPerPart, CharsPerPart);
var PartCode = 0;
for(var j = 0; j < SubPart.length; j++) {
PartCode = PartCode + HashBase.indexOf(SubPart.substr(j, 1));
}
if(i != 0) {
PartCode = PartCode*i;
}
PartCode = PartCode + HashBase.indexOf(Hash.length, 1) * Source.length;
while(PartCode > HashBase.length) {
PartCode = PartCode - HashBase.length;
}
while(PartCode < 0) {
PartCode++;
}
if(HashBase.substr(PartCode, 1) == 'undefined') {
Hash = Hash + HashBase.substr(i, 1);
} else {
Hash = Hash + HashBase.substr(PartCode, 1);
}
}
return Hash;
}
und wenn das hier fertig ist, also schätzungsweise Monat morgen, kannst du hier dann deinen Code mal posten, würde mich echt mal interressieren =)
Kommentar
-
Herylichen Glueckwunsch Blackgreetz. Da ist mir doch tatsaechlich vor Schreck grade die Festplatte weggeballert - bin grade auf nem live debian. Werde, wenn hier alles wieder geht, meinen Code posten. Zwischenzeitlich kannst du ja die naechste Aufgabe formulieren ..
Kommentar
-
Nenene, so geht das nicht. Du musst dir schon selbst was ausdenken!
Ach ja, hier meine Implementation:
PHP-Code:<?php
function hashMe($sToHash) {
if(strlen($sToHash) == 0) {
return false;
}
if(strlen($sToHash) < 9) {
// Weniger als 9 Zeichen
$iRound = 0;
while(strlen($sToHash) < 9) {
$sToHash.= $sToHash[$iRound];
$iRound++;
}
} elseif(strlen($sToHash) == 9) {
// Genau 9 Zeichen
} elseif(strlen($sToHash) > 9) {
// Mehr als 9 Zeichen
$iRest = strlen($sToHash) % 9;
$iToFill = 9 - $iRest;
for($i = 0; $i < $iToFill; $i++) {
$sToHash.= $sToHash[$i];
}
}
// Chunk-Size
$iChunkSize = strlen($sToHash) / 9;
// Wieviel Chunks haben wir
$iChunkCount = strlen($sToHash) / $iChunkSize;
// Chunks berechnen
for($i = 0; $i < $iChunkCount; $i++) {
// Chunk holen
$sChunk = substr($sToHash, $i * $iChunkSize, $iChunkSize);
$iDigit = 0;
// Direkten Chunkwert ermitteln
for($j = 0; $j < strlen($sChunk); $j++) {
$iDigit = $iDigit + ord($sChunk[$j]);
}
while($iDigit >= 10) {
$iDigit = quersumme($iDigit);
}
// Speichern
$iHash.= $iDigit;
unset($iDigit);
}
// Ausgeben
return $iHash;
}
function quersumme($iZahl) {
$sZahl = (string) $iZahl;
for($i = 0; $i < strlen($sZahl); $i++) {
$iOutput = $iOutput + (int) $sZahl[$i];
}
return $iOutput;
}
?>
Kommentar
-
Menno, da ist einmal nen Freund da und man hat nicht so viel Zeit zum coden und schon ist die schöne Aufgabe gelöst, bevor man richtig anfangen kann.
Naja, her mit der nächsten Aufgabe^^Assembler ist eine Methode,
Programme, die zu langsam laufen,
so umzuschreiben,
dass sie überhaupt nicht mehr laufen.
Kommentar
Kommentar