Commit f76d824c authored by Kirill Smelkov's avatar Kirill Smelkov

go/neo/internal/xsha1: New package to compute NEO-flavoured SHA1

It is the same as regular SHA1 but returns all-zeros for empty input.
Besides there is runtime knob to skip checksum computation to benchmark
how much time and latency SHA1 computation introduces.

See the following links for some preliminary history:

- bc2cddfc
- https://navytux.spb.ru/~kirr/neo.html#results-and-discussion
parent 561eaf8c
// Copyright (C) 2017-2021 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
// Package xsha1 provides NEO-flavoured SHA1 sum.
//
// It is the same as regular SHA1, but returns all-zeros for empty input.
//
// Besides, checksum computation can be switched to be noop if requested so
// from environment.
package xsha1
import (
"crypto/sha1"
"fmt"
"os"
)
// Skip controls and indicates whether NEOSum skips SHA1 computation.
//
// It is used for benchmarking to see how much sha1 computation takes time from latency.
var Skip bool
func init() {
if os.Getenv("X_NEOGO_SHA1_SKIP") == "y" {
fmt.Fprintf(os.Stderr, "# NEO/go (%s): skipping SHA1 computations\n", os.Args[0])
Skip = true
}
}
// NEOSum returns SHA1(b) computed by NEO rules.
//
// it is the same as regular SHA1, but returns all-zeros for empty b.
// https://lab.nexedi.com/nexedi/neoppod/blob/c1c26894/neo/client/app.py#L464-468
func NEOSum(b []byte) [sha1.Size]byte {
if len(b) == 0 {
return [sha1.Size]byte{} // all 0
}
if !Skip {
return sha1.Sum(b)
}
return [sha1.Size]byte{} // all 0
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment