Skip to content

Commit d9cab68

Browse files
authored
Create main.py
1 parent 2912198 commit d9cab68

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

main.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import struct
2+
3+
class HashX:
4+
def __init__(self, seed=0xABCDEF):
5+
"""Initialize the hash state with a seed."""
6+
self.seed = seed
7+
self.state = [seed, seed ^ 0x12345678, seed ^ 0x87654321, seed ^ 0xFEDCBA98]
8+
9+
def _mix(self, v):
10+
"""Mixing function to ensure diffusion."""
11+
v ^= v >> 13
12+
v *= 0x85EBCA6B
13+
v ^= v >> 16
14+
return v & 0xFFFFFFFFFFFFFFFF # 64-bit mask
15+
16+
def _rotate_left(self, x, r):
17+
"""Bitwise rotation (left)."""
18+
return ((x << r) | (x >> (64 - r))) & 0xFFFFFFFFFFFFFFFF
19+
20+
def update(self, data):
21+
"""Process input data in 64-byte chunks."""
22+
if isinstance(data, str):
23+
data = data.encode('utf-8') # Convert string to bytes
24+
25+
length = len(data)
26+
padded_data = data + b'\x00' * (64 - (length % 64)) # Padding
27+
blocks = [padded_data[i:i+8] for i in range(0, len(padded_data), 8)]
28+
29+
for i, block in enumerate(blocks):
30+
v = struct.unpack('<Q', block)[0] # Convert to 64-bit integer
31+
v = self._mix(v)
32+
self.state[i % 4] ^= v
33+
self.state[i % 4] = self._rotate_left(self.state[i % 4], (i * 7) % 64)
34+
35+
def digest(self):
36+
"""Generate final 256-bit hash."""
37+
final_hash = b''
38+
for i in range(4):
39+
self.state[i] = self._mix(self.state[i] ^ (self.seed + i))
40+
final_hash += struct.pack('<Q', self.state[i]) # Convert back to bytes
41+
return final_hash.hex()
42+
43+
def hash(self, data):
44+
"""Convenience function to compute hash in one call."""
45+
self.update(data)
46+
return self.digest()
47+
48+
# Example usage:
49+
hasher = HashX()
50+
print(hasher.hash("Hello, World!"))

0 commit comments

Comments
 (0)