cubefs

Форк
0
77 строк · 1.6 Кб
1
//go:build (!amd64 && !arm64) || appengine || !gc || purego || noasm
2
// +build !amd64,!arm64 appengine !gc purego noasm
3

4
package xxhash
5

6
// Sum64 computes the 64-bit xxHash digest of b.
7
func Sum64(b []byte) uint64 {
8
	// A simpler version would be
9
	//   d := New()
10
	//   d.Write(b)
11
	//   return d.Sum64()
12
	// but this is faster, particularly for small inputs.
13

14
	n := len(b)
15
	var h uint64
16

17
	if n >= 32 {
18
		v1 := prime1v + prime2
19
		v2 := prime2
20
		v3 := uint64(0)
21
		v4 := -prime1v
22
		for len(b) >= 32 {
23
			v1 = round(v1, u64(b[0:8:len(b)]))
24
			v2 = round(v2, u64(b[8:16:len(b)]))
25
			v3 = round(v3, u64(b[16:24:len(b)]))
26
			v4 = round(v4, u64(b[24:32:len(b)]))
27
			b = b[32:len(b):len(b)]
28
		}
29
		h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
30
		h = mergeRound(h, v1)
31
		h = mergeRound(h, v2)
32
		h = mergeRound(h, v3)
33
		h = mergeRound(h, v4)
34
	} else {
35
		h = prime5
36
	}
37

38
	h += uint64(n)
39

40
	i, end := 0, len(b)
41
	for ; i+8 <= end; i += 8 {
42
		k1 := round(0, u64(b[i:i+8:len(b)]))
43
		h ^= k1
44
		h = rol27(h)*prime1 + prime4
45
	}
46
	if i+4 <= end {
47
		h ^= uint64(u32(b[i:i+4:len(b)])) * prime1
48
		h = rol23(h)*prime2 + prime3
49
		i += 4
50
	}
51
	for ; i < end; i++ {
52
		h ^= uint64(b[i]) * prime5
53
		h = rol11(h) * prime1
54
	}
55

56
	h ^= h >> 33
57
	h *= prime2
58
	h ^= h >> 29
59
	h *= prime3
60
	h ^= h >> 32
61

62
	return h
63
}
64

65
func writeBlocks(d *Digest, b []byte) int {
66
	v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4
67
	n := len(b)
68
	for len(b) >= 32 {
69
		v1 = round(v1, u64(b[0:8:len(b)]))
70
		v2 = round(v2, u64(b[8:16:len(b)]))
71
		v3 = round(v3, u64(b[16:24:len(b)]))
72
		v4 = round(v4, u64(b[24:32:len(b)]))
73
		b = b[32:len(b):len(b)]
74
	}
75
	d.v1, d.v2, d.v3, d.v4 = v1, v2, v3, v4
76
	return n - len(b)
77
}
78

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.