- Notifications
You must be signed in to change notification settings - Fork4
Simple tool to calc Golang module checksum of go.mod and module dir.
License
vikyd/go-checksum
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Simple tool to calc Golang module checksum ofgo.mod
andmodule directory
.
This README also describes how Golang go.sum calc hash from file conent.
Maybe this is the missing official doc for how Golang go.sum calc hash from file conent
- Github:https://github.com/gin-gonic/gin
- Example Version: v1.4.0
- CheckSum:https://sum.golang.org/lookup/github.com/gin-gonic/gin@v1.4.0
git clone https://github.com/gin-gonic/gin.gitgit checkout v1.4.0
go get -u github.com/vikyd/go-checksum
go-checksum relOrAbsPathOfGinDir/go.mod
will print like:
file: /Users/viky/tmp/gin/go.mod{"Hash": "b1946b355a09fedc3865073bbeb5214de686542bbeaea9e1bf83cb3a08f66b99","HashBase64": "sZRrNVoJ/tw4ZQc7vrUhTeaGVCu+rqnhv4PLOgj2a5k=","HashSynthesized": "396d84667dc33bc2e7f6820a3af33ef8b04efb950f1c92431fbdbfabfdeb65d3","HashSynthesizedBase64": "OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=","GoCheckSum": "h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM="}
The output hash"GoCheckSum": "h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM="
is the same as
the online checksum:github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
(fromhere)
go-checksum relOrAbsPathOfGinDir github.com/gin-gonic/gin@v1.4.0
- 1st param: module directory
- no need to remove .git, will ignore
- 2nd param: module prefix with version
- necessary for dir checksum
willprint like:
directory: /Users/viky/tmp/gin{"HashSynthesized": "ded3280827ccee9a6ab11d29b73ff08b58a6a4da53efff7042d319f25af59824","HashSynthesizedBase64": "3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=","GoCheckSum": "h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ="}
The output hash"GoCheckSum": "h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ="
is the same as
the online checksum:github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
(fromhere)
Steps:
- tell me the path of
go.mod
- read content from
go.mod
, as variablecontent
- calc SHA256 hash from
content
, as variablehash
- mix some string with
hash
, as variablemixedHash
hash go.mod\n
- if
hash
is:CDa7N
- then
mixedHash
is: CDa7N go.mod\n
- yeah, that's a strange string
- calc SHA256 hash from
mixedHash
, as variablehashSynthesized
- calc Base64 from
hashSynthesized
, as variablehashSynthesizedBase64
- finally, in
go.sum
, the string is:h1:hashSynthesizedBase64
, as variableGoCheckSum
- if
hashSynthesized
is:CCfM7
- then
GoCheckSum
is:h1:CCfM7
h1
:The hash begins with an algorithm prefix of the form "h:". The only defined algorithm prefix is "h1:", which uses SHA-256.h
: hash
- if
Steps:
- tell me the path of
module's dir
andmodule's prefix
(also named import path)module's prefix
is used to calc hash, as part of the content string
- clean the dir path, to remove duplicate path seperator etc.
- loop each file in
module's dir
- only consider file, not dir
- find the relative path of the file (relative to
module's dir
) - join file relative path with
module's prefix
, as variablefileImportPath
- example:
- one file in gin project:
gin.go
- its module's dir:
/dir01/dir02/gin
- its absolute path:
/dir01/dir02/gin/gin.go
- its relative path:
gin.go
- final string
fileImportPath
:github.com/gin-gonic/gin@v1.4.0/gin.go
- one file in gin project:
- after the loop, we got a list
fileImportPath
of all files, as variablefiles
- except files in
.git
- except files in
- sort
files
as string in increasion order - then begin hash steps
- loop sorted
files
- read content from a file of
files
, as variablecontent
- calc SHA256 hash from
content
, as variablehash
- mix some string with
hash
, as variablemixedHash
hash fileImportPath\n
- if
hash
is:CDa7N
- if
fileImportPath
is:github.com/gin-gonic/gin@v1.4.0/gin.go
- then
mixedHash
is: CDa7N github.com/gin-gonic/gin@v1.4.0/gin.go\n
- yeah, that's a strange string
- read content from a file of
- after this loop, we can get a single long string joined by all files'
mixedHash
, as variablemixedHashAll
- example:
CDa7N github.com/gin-gonic/gin@v1.4.0/gin.go\nEFb8M github.com/gin-gonic/gin@v1.4.0/context.go\n ...
- calc SHA256 hash from
mixedHashAll
, as variablehashSynthesized
- calc Base64 from
hashSynthesized
, as variablehashSynthesizedBase64
- finally, in
go.sum
, the string is:h1:hashSynthesizedBase64
, as variableGoCheckSum
- if
hashSynthesized
is:CCfM7
- then
GoCheckSum
is:h1:CCfM7
h1
:The hash begins with an algorithm prefix of the form "h:". The only defined algorithm prefix is "h1:", which uses SHA-256.h
: hash
- if
Golang source code about how to calc hash for modules:https://github.com/golang/mod/blob/release-branch.go1.15/sumdb/dirhash/hash.go
About
Simple tool to calc Golang module checksum of go.mod and module dir.
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.