Class: TestBench::Output::Digest
- Inherits:
-
Object
- Object
- TestBench::Output::Digest
show all
- Defined in:
- lib/test_bench/output/digest.rb
Defined Under Namespace
Modules: Defaults
Classes: Null
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Instance Attribute Details
#buffer ⇒ Object
9
10
11
|
# File 'lib/test_bench/output/digest.rb', line 9
def buffer
@buffer ||= String.new(encoding: 'BINARY', capacity: Defaults.size_bytes * 2)
end
|
#last_digest ⇒ Object
4
5
6
|
# File 'lib/test_bench/output/digest.rb', line 4
def last_digest
@last_digest ||= 0
end
|
Class Method Details
20
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/test_bench/output/digest.rb', line 20
def self.configure(receiver, inert: nil, attr_name: nil)
attr_name ||= :digest
inert = true if inert.nil?
if inert
instance = Null.new
else
instance = self.new
end
receiver.public_send(:"#{attr_name}=", instance)
end
|
.digest(data) ⇒ Object
14
15
16
17
18
|
# File 'lib/test_bench/output/digest.rb', line 14
def self.digest(data)
instance = new
instance.update(data)
instance.digest
end
|
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# File 'lib/test_bench/output/digest.rb', line 82
def self.format(digest)
if digest < 0
sign_mask = 0x1 << (8 * Defaults.size_bytes - 1)
mask = (256 ** Defaults.size_bytes - 1) ^ sign_mask
digest_uint64 = ~digest & mask | sign_mask
else
digest_uint64 = digest
end
"0x%016X" % digest_uint64
end
|
Instance Method Details
#clone ⇒ Object
33
34
35
36
37
38
|
# File 'lib/test_bench/output/digest.rb', line 33
def clone
cloned_digest = Digest.new
cloned_digest.last_digest = last_digest
cloned_digest.buffer << buffer
cloned_digest
end
|
#digest ⇒ Object
Also known as:
value, to_i
59
60
61
62
63
64
65
66
67
|
# File 'lib/test_bench/output/digest.rb', line 59
def digest
buffer_bytes = buffer.unpack('C*')[0...8]
buffer_int64 = buffer_bytes.reduce(0) do |int64, byte|
(int64 << 8) | byte
end
(last_digest + buffer_int64) % (256 ** Defaults.size_bytes - 1)
end
|
#digest?(data) ⇒ Boolean
71
72
73
74
75
|
# File 'lib/test_bench/output/digest.rb', line 71
def digest?(data)
other_digest = self.class.digest(data)
digest == other_digest
end
|
77
78
79
|
# File 'lib/test_bench/output/digest.rb', line 77
def format
self.class.format(value)
end
|
#to_s ⇒ Object
80
81
82
|
# File 'lib/test_bench/output/digest.rb', line 80
def format
self.class.format(value)
end
|
#update(data) ⇒ Object
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/test_bench/output/digest.rb', line 40
def update(data)
digest_size_bytes = Defaults.size_bytes
(0..data.bytesize).step(digest_size_bytes).each do |position|
next_bytes = data.byteslice(position, digest_size_bytes)
next_bytes.force_encoding('BINARY')
buffer << next_bytes
if buffer.length >= digest_size_bytes
self.last_digest = digest
buffer.slice!(0, 8)
end
end
digest
end
|