是什么导致我的 md5 散列不正确?

What is causing my md5 hash to come out incorrectly?

#!/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 和 'code' 应该基于 60 秒 间隔,所以我要生成的代码应该来自 421, 141、380。

生成的散列应该是 042876ca07cb2d993601fb40a1525736,但我越来越 d49904f9e7e62d0ff16e523d89be08eb。谁能告诉我我在做什么 到底错在哪里?

我读到 bash 在末尾留下一个换行符 字符串,所以我 运行 回显 -n 选项以删除该换行符,但我 仍然没有得到想要的结果。

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' (换行符已被 shell 修剪掉捕获变量的末尾);和 (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 "$@" | cut -d ' ' -f 1; }
hash=$(printf '%s' "$difference" | md5 | tr -d '\n' | md5)