是什么导致我的 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)
#!/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)