2016-04-29 2 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 

Я пытаюсь написать программу, которая принимает время эпохи и текущего времени, вычисляет разницу в секундах, а затем создает код, выполнив двойной md5 хэш на время в секундах. В какие времена Я ввел в настоящее время, разница в секундах должна быть 421, 141, 406, а «код» должен быть основан на 60-секундном интервале , поэтому код, который я пытаюсь создать, должен родом из 421, 141, 380.Что вызывает хеш md5, который выходит неправильно?

Полученный хэш должен быть 042876ca07cb2d993601fb40a1525736, но я получаю d49904f9e7e62d0ff16e523d89be08eb. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Я прочитал, что Баш оставляет символ новой строки в конце строк, поэтому я побежал эхо с -n вариант, чтобы удалить эту строку, но я до сих пор не получать предпочтительные результаты.

+0

Почему вы используете 'md5sum' ** дважды **? Кроме того, ** что ** 'String' производит ваш ожидаемый результат? –

+0

Это было частью задания, и нам сказали md5 (md5 (разность)), поэтому переменная, написанная как «разница», отражается в md5, а затем я устанавливаю «hash» как разность md5. – Sherbs

+0

Какое окончательное число должно точно выражать ожидаемый хеш? – tripleee

ответ

1

Выход md5sum на многих платформах не только MD5 сумма. Например, в системе GNU/Linux, вы получаете

debian$ echo -n 401 | md5sum 
816b112c6105b3ebd537828a39af4818 - 

Обратите внимание, что на выходе имеет два поля: Фактическая сумма MD5, а затем два пробела, а затем по имени входного файла (где - стенды для стандартного ввода).

(В противоположность этому, на OSX, и я бы ожидать, что большинство * BSD, вы получите

yosemite$ echo -n 401 | md5 
816b112c6105b3ebd537828a39af4818 

Здесь вы увидите, что имя утилиты MD5 отличается.)

В Исправление должно быть простым. Я отредактировал ваш код до (a) предпочитает портативный printf более менее портативный echo -n; (b) удалить полностью лишний окончательный tr -d '\n' (новые строки обрезаны с конца захваченной переменной оболочкой уже); и (c) все сворачивает в один трубопровод.

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

Для полноты данного кода также имеется правильное цитирование; здесь это не является строго необходимым (но это было бы, если бы вам действительно нужно было сохранить интервал в стоимости, которую вы первоначально получили от md5sum, например), но пропущенные кавычки - общая проблема новичков, которой следует избегать.

(Захватив переменную только так вы можете echo также общий новичок антипаттерн;., Но ваш код будет нужно использовать переменную hash впоследствии)

Повторные код всегда неприятный запах; возможно, предоставляет функцию, которая выполняет ту же работу, что и утилита * BSD md5;

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

Вау, большое вам спасибо! Благодарим вас за все ваши объяснения и предложения. Ты мне очень помог. – Sherbs

Смежные вопросы