mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-11-24 14:35:53 +00:00
Add a xoShiRo256PlusPlus implementation
This commit is contained in:
parent
c26b4deefe
commit
0d09d1df66
37
domain/consensus/utils/pow/xoshiro.go
Normal file
37
domain/consensus/utils/pow/xoshiro.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package pow
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
||||||
|
"math/bits"
|
||||||
|
)
|
||||||
|
|
||||||
|
type xoShiRo256PlusPlus struct {
|
||||||
|
s0 uint64
|
||||||
|
s1 uint64
|
||||||
|
s2 uint64
|
||||||
|
s3 uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func newxoShiRo256PlusPlus(hash *externalapi.DomainHash) *xoShiRo256PlusPlus {
|
||||||
|
hashArray := hash.ByteArray()
|
||||||
|
return &xoShiRo256PlusPlus{
|
||||||
|
s0: binary.LittleEndian.Uint64(hashArray[:8]),
|
||||||
|
s1: binary.LittleEndian.Uint64(hashArray[8:16]),
|
||||||
|
s2: binary.LittleEndian.Uint64(hashArray[16:24]),
|
||||||
|
s3: binary.LittleEndian.Uint64(hashArray[24:32]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *xoShiRo256PlusPlus) Uint64() uint64 {
|
||||||
|
res := bits.RotateLeft64(x.s0+x.s3, 23) + x.s0
|
||||||
|
t := x.s1 << 17
|
||||||
|
x.s2 ^= x.s0
|
||||||
|
x.s3 ^= x.s1
|
||||||
|
x.s1 ^= x.s2
|
||||||
|
x.s0 ^= x.s3
|
||||||
|
|
||||||
|
x.s2 ^= t
|
||||||
|
x.s3 = bits.RotateLeft64(x.s3, 45)
|
||||||
|
return res
|
||||||
|
}
|
||||||
17
domain/consensus/utils/pow/xoshiro_test.go
Normal file
17
domain/consensus/utils/pow/xoshiro_test.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package pow
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
// Test vectors are from here: https://github.com/rust-random/rngs/blob/17aa826cc38d3e8408c9489ac859fa9397acd479/rand_xoshiro/src/xoshiro256plusplus.rs#L121
|
||||||
|
func TestXoShiRo256PlusPlus_Uint64(t *testing.T) {
|
||||||
|
state := xoShiRo256PlusPlus{1, 2, 3, 4}
|
||||||
|
expected := []uint64{41943041, 58720359, 3588806011781223, 3591011842654386,
|
||||||
|
9228616714210784205, 9973669472204895162, 14011001112246962877,
|
||||||
|
12406186145184390807, 15849039046786891736, 10450023813501588000}
|
||||||
|
for _, ex := range expected {
|
||||||
|
val := state.Uint64()
|
||||||
|
if val != ex {
|
||||||
|
t.Errorf("expected: %d, found: %d", ex, val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user