|
1 | 1 | import struct |
| 2 | +import threading |
2 | 3 |
|
3 | 4 | class HashX: |
4 | 5 | def __init__(self, seed=0xABCDEF): |
5 | | - """Initialize the hash state with a seed.""" |
| 6 | + """Initialize hash state with a seed.""" |
6 | 7 | self.seed = seed |
7 | 8 | self.state = [seed, seed ^ 0x12345678, seed ^ 0x87654321, seed ^ 0xFEDCBA98] |
8 | 9 |
|
9 | 10 | def _mix(self, v): |
10 | | - """Mixing function to ensure diffusion.""" |
| 11 | + """Improved mixing function for better diffusion and security.""" |
11 | 12 | v ^= v >> 13 |
12 | 13 | v *= 0x85EBCA6B |
13 | 14 | v ^= v >> 16 |
| 15 | + v *= 0xC2B2AE35 |
| 16 | + v ^= v >> 16 |
14 | 17 | return v & 0xFFFFFFFFFFFFFFFF # 64-bit mask |
15 | 18 |
|
16 | 19 | def _rotate_left(self, x, r): |
17 | | - """Bitwise rotation (left).""" |
| 20 | + """Bitwise left rotation for fast scrambling.""" |
18 | 21 | return ((x << r) | (x >> (64 - r))) & 0xFFFFFFFFFFFFFFFF |
19 | 22 |
|
| 23 | + def _process_chunk(self, chunk, index): |
| 24 | + """Multi-threaded processing of input chunks.""" |
| 25 | + v = struct.unpack('<Q', chunk)[0] # Convert to 64-bit integer |
| 26 | + v = self._mix(v) |
| 27 | + self.state[index % 4] ^= v |
| 28 | + self.state[index % 4] = self._rotate_left(self.state[index % 4], (index * 7) % 64) |
| 29 | + |
20 | 30 | def update(self, data): |
21 | | - """Process input data in 64-byte chunks.""" |
| 31 | + """Process input data in 64-byte chunks with multi-threading.""" |
22 | 32 | if isinstance(data, str): |
23 | 33 | data = data.encode('utf-8') # Convert string to bytes |
24 | | - |
| 34 | + |
25 | 35 | length = len(data) |
26 | 36 | padded_data = data + b'\x00' * (64 - (length % 64)) # Padding |
27 | 37 | blocks = [padded_data[i:i+8] for i in range(0, len(padded_data), 8)] |
28 | 38 |
|
| 39 | + threads = [] |
29 | 40 | 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) |
| 41 | + thread = threading.Thread(target=self._process_chunk, args=(block, i)) |
| 42 | + threads.append(thread) |
| 43 | + thread.start() |
| 44 | + |
| 45 | + for thread in threads: |
| 46 | + thread.join() |
34 | 47 |
|
35 | 48 | def digest(self): |
36 | 49 | """Generate final 256-bit hash.""" |
|
0 commit comments