2016-04-29 8 views
0
#!/bin/bash 

# Program's Purpose: Compute time elapsed between epoch time and current time 
# Produce an MD5 hash from that time 
# Get code from that hash 

# compute time elapsed in seconds between epoch time and current time 
#EPOCH=$(date -u -d '2001-02-03 04:05:06' '+%F %H:%M:%S') 
#CURRENT=$(date -u -d '2010-06-13 12:55:34' '+%F %H:%M:%S') 
# code: dd15 
EPOCH=$(date -u -d '1999-12-31 23:59:59' '+%F %H:%M:%S') 
CURRENT=$(date -u -d '2013-05-06 07:43:25' '+%F %H:%M:%S') 
# interval is time elapsed minus time elapsed % 60 

echo $EPOCH 
echo $CURRENT 
read YEAR1 M1 DAY1 HOUR1 MIN1 SEC1 <<< "${EPOCH//[:-]/ }" 
read YEAR2 M2 DAY2 HOUR2 MIN2 SEC2 <<< "${CURRENT//[:-]/ }" 
echo $YEAR1 $M1 $DAY1 $HOUR1 $MIN1 $SEC1 

# date in seconds from 
sec1=$(date -d "$EPOCH" -u +%s) 
sec2=$(date -d "$CURRENT" -u +%s) 
echo $sec1 
echo $sec2 

# get the difference from the two times 
difference=$((sec2 - sec1)) 
difference=$((difference - ((difference % 60)))) 
echo $difference 

# get the hash from the time 
hash=$(echo -n $difference | md5sum | tr -d '\n') 
hash=$(echo -n $hash | md5sum | tr -d '\n') 
echo $hash 

# creating two strings, one with all of the letters 
# the other with all of the numbers 
letter=$(echo $hash | sed 's/[0-9]*//g' | cut -c1-2) 
echo $letter 
num=$(echo $hash | sed 's/[^0-9]*//g') 
echo $num 
#num=$(echo $num | cut -c1-2) 
#echo $num 

# getting the last two numbers in reverse order 
num1=$(echo ${num: -1}) 
num=$(echo "${num::-1}") 
echo $num 
num2=$(echo ${num: -1}) 
code="$letter$num1$num2" 
echo $code 

Ich versuche, ein Programm zu schreiben, die eine Epoche Zeit und aktuelle Zeit in Anspruch nimmt, berechnet die Differenz in Sekunden und erstellt dann einen Code durch einen doppelten MD5-Hash auf der Zeit in Sekunden zu tun. Zu welcher Zeit habe ich derzeit eingegeben, sollte der Unterschied in Sekunden 421, 141, 406 sein, und der 'Code' soll auf 60-Sekunden Intervallen basieren, so dass der Code, den ich versuche zu generieren, sollte kommen aus 421, 141, 380.Was verursacht, dass mein MD5-Hash falsch ausgegeben wird?

Der resultierende Hash sollte 042876ca07cb2d993601fb40a1525736 sein, aber ich bin immer d49904f9e7e62d0ff16e523d89be08eb. Kann mir jemand sagen, was ich gerade mache falsch?

las ich, dass bash eine neue Zeile am Ende der Saiten verläßt, so lief ich mit -n Option Echo, das Newline zu entfernen, aber ich bin noch nicht die bevorzugten Ergebnisse.

+0

Warum laufen Sie 'md5sum' ** zweimal **? Auch, ** was ** 'String' produziert Ihre erwartete Ausgabe? –

+0

Dies war Teil einer Zuweisung, und wir wurden aufgefordert, md5 (md5 (Differenz)), so dass die Variable geschrieben als "Differenz" in md5 Echo, und dann setze ich "Hash" zu md5 der Differenz. – Sherbs

+0

Welche letzte Zahl sollte genau den erwarteten Hash ergeben? – tripleee

Antwort

1

Die Ausgabe von md5sum auf vielen Plattformen ist nicht nur die MD5-Summe. Zum Beispiel auf einem GNU/Linux-System, erhalten Sie

debian$ echo -n 401 | md5sum 
816b112c6105b3ebd537828a39af4818 - 

Beachten Sie, dass die Ausgabe hat zwei Felder: Die tatsächliche MD5-Summe, gefolgt von zwei Räumen, durch die Eingabedateinamen gefolgt (wo - steht für die Standardeingabe).

(Im Gegensatz dazu auf OSX, und ich würde die meisten * BSDs erwarten Sie

yosemite$ echo -n 401 | md5 
816b112c6105b3ebd537828a39af4818 

Hier bekommen, werden Sie feststellen, dass der Name des MD5 Dienstprogramm unterscheidet.)

Die Fix sollte einfach sein. Ich habe Ihren Code auf umgestaltet (a) bevorzugen Sie das tragbare printf über das weniger tragbare echo -n; (b) Entfernen Sie das vollständig überflüssige letzte tr -d '\n' (Zeilenumbrüche werden bereits am Ende der erfassten Variablen von der Shell abgeschnitten); und (c) falten alles in einer einzigen Pipeline.

hash=$(printf '%s' "$difference" | md5sum | cut -d ' ' -f 1 | tr -d '\n' | 
    md5sum | cut -d ' ' -f 1) 
echo "$hash" 

Der Vollständigkeit halber hat dieser Code auch eine korrekte Quotierung; es ist hier nicht unbedingt notwendig (aber es wäre gewesen, wenn Sie wirklich den Abstand in dem Wert beibehalten müssten, den Sie ursprünglich von md5sum erhalten haben), aber das Weglassen von Anführungszeichen ist ein häufiges Anfängerproblem, das vermieden werden sollte.

(Capturing eine Variable nur damit Sie echo kann, ist es auch ein gemeinsames Neuling Antipattern,., Aber der Code wird die Variable hash anschließend verwenden möchten)

Wiederholte Code ist immer ein schlechter Geruch; stellen Sie vielleicht eine Funktion zur Verfügung, die den gleichen Job wie das * BSD md5 Dienstprogramm durchführt;

md5() { md5sum "[email protected]" | cut -d ' ' -f 1; } 
hash=$(printf '%s' "$difference" | md5 | tr -d '\n' | md5) 
+0

Wow, vielen Dank! Danke für all Ihre Erklärungen und Vorschläge. Du hast mir wirklich sehr geholfen. – Sherbs

Verwandte Themen