9effd64290
* core, eth, trie: bloom filter for trie node dedup during fast sync * eth/downloader, trie: address review comments * core, ethdb, trie: restart fast-sync bloom construction now and again * eth/downloader: initialize fast sync bloom on startup * eth: reenable eth/62 until we properly remove it
145 lines
3.5 KiB
Go
145 lines
3.5 KiB
Go
//
|
|
// Package hamming distance calculations in Go
|
|
//
|
|
// https://github.com/steakknife/hamming
|
|
//
|
|
// Copyright © 2014, 2015, 2016, 2018 Barry Allard
|
|
//
|
|
// MIT license
|
|
//
|
|
package hamming
|
|
|
|
// Int8s hamming distance of two int8 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Int8s(b0, b1 []int8) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Int8(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Int16s hamming distance of two int16 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Int16s(b0, b1 []int16) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Int16(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Int32s hamming distance of two int32 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Int32s(b0, b1 []int32) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Int32(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Int64s hamming distance of two int64 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Int64s(b0, b1 []int64) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Int64(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Ints hamming distance of two int buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Ints(b0, b1 []int) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Int(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Uint8s hamming distance of two uint8 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Uint8s(b0, b1 []uint8) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Uint8(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Uint16s hamming distance of two uint16 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Uint16s(b0, b1 []uint16) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Uint16(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Uint32s hamming distance of two uint32 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Uint32s(b0, b1 []uint32) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Uint32(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Uint64s hamming distance of two uint64 buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Uint64s(b0, b1 []uint64) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Uint64(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Uints hamming distance of two uint buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Uints(b0, b1 []uint) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Uint(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Bytes hamming distance of two byte buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Bytes(b0, b1 []byte) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Byte(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Runes hamming distance of two rune buffers, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Runes(b0, b1 []rune) int {
|
|
d := 0
|
|
for i, x := range b0 {
|
|
d += Rune(x, b1[i])
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Strings hamming distance of two strings, of which the size of b0
|
|
// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0)
|
|
func Strings(b0, b1 string) int {
|
|
return Runes(runes(b0), runes(b1))
|
|
}
|
|
|
|
// runize string
|
|
func runes(s string) (r []rune) {
|
|
for _, ch := range s {
|
|
r = append(r, ch)
|
|
}
|
|
return
|
|
}
|