Class: SipHash::State
- Inherits:
-
Object
- Object
- SipHash::State
- Defined in:
- lib/opendns-dnsdb/dnsdb/siphash.rb
Constant Summary collapse
- MASK_64 =
0xffffffffffffffff
Instance Method Summary collapse
- #apply_block(m) ⇒ Object
- #compress ⇒ Object
- #digest ⇒ Object
- #finalize ⇒ Object
-
#initialize(key) ⇒ State
constructor
A new instance of State.
- #rotl64(num, shift) ⇒ Object
Constructor Details
#initialize(key) ⇒ State
Returns a new instance of State.
42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 42 def initialize(key) @v0 = 0x736f6d6570736575 @v1 = 0x646f72616e646f6d @v2 = 0x6c7967656e657261 @v3 = 0x7465646279746573 k0 = key.slice(0, 8).unpack("Q<")[0] k1 = key.slice(8, 8).unpack("Q<")[0] @v0 ^= k0 @v1 ^= k1 @v2 ^= k0 @v3 ^= k1 end |
Instance Method Details
#apply_block(m) ⇒ Object
57 58 59 60 61 |
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 57 def apply_block(m) @v3 ^= m 2.times { compress } @v0 ^= m end |
#compress ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 67 def compress @v0 = (@v0 + @v1) & MASK_64 @v2 = (@v2 + @v3) & MASK_64 @v1 = rotl64(@v1, 13) @v3 = rotl64(@v3, 16) @v1 ^= @v0 @v3 ^= @v2 @v0 = rotl64(@v0, 32) @v2 = (@v2 + @v1) & MASK_64 @v0 = (@v0 + @v3) & MASK_64 @v1 = rotl64(@v1, 17) @v3 = rotl64(@v3, 21) @v1 ^= @v2 @v3 ^= @v0 @v2 = rotl64(@v2, 32) end |
#digest ⇒ Object
89 90 91 |
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 89 def digest @v0 ^ @v1 ^ @v2 ^ @v3 end |
#finalize ⇒ Object
84 85 86 87 |
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 84 def finalize @v2 ^= 0xff 4.times { compress } end |
#rotl64(num, shift) ⇒ Object
63 64 65 |
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 63 def rotl64(num, shift) ((num << shift) & MASK_64) | (num >> (64 - shift)) end |