81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
import timeit
|
|
import secrets
|
|
import math
|
|
|
|
primes = (0x3FFFFFFB, 0x3FFFFF29, 0x3FFFFF0B, 0x2FFFFFFF, 0x2FFFFF5B)
|
|
|
|
# --- Lógica Actual (Bucle) ---
|
|
def get_multiplier_current(i, multiplier, primes, p_len, jumps, jump):
|
|
value = (i + multiplier + primes[(i + jump) % p_len]) & 0x3FFFFFFF
|
|
for _ in range(jumps):
|
|
shift = 13 + i % 8
|
|
if i & 1:
|
|
value ^= (value >> shift)
|
|
else:
|
|
value ^= (value << shift)
|
|
value = (value + primes[i := (i + jump) % p_len]) & 0x3FFFFFFF
|
|
return value
|
|
|
|
# --- Lógica Optimizada (Unrolled) ---
|
|
def get_multiplier_fast(i, multiplier, primes, p_len, jump):
|
|
# Asumiendo que jumps siempre es 3
|
|
value = (i + multiplier + primes[(i + jump) % p_len]) & 0x3FFFFFFF
|
|
|
|
# Salto 1
|
|
shift = 13 + i % 8
|
|
value ^= (value >> shift if i & 1 else value << shift)
|
|
value = (value + primes[i := (i + jump) % p_len]) & 0x3FFFFFFF
|
|
|
|
# Salto 2
|
|
shift = 13 + i % 8
|
|
value ^= (value >> shift if i & 1 else value << shift)
|
|
value = (value + primes[i := (i + jump) % p_len]) & 0x3FFFFFFF
|
|
|
|
# Salto 3
|
|
shift = 13 + i % 8
|
|
value ^= (value >> shift if i & 1 else value << shift)
|
|
value = (value + primes[i := (i + jump) % p_len]) & 0x3FFFFFFF
|
|
|
|
return value
|
|
|
|
# --- 2. Lógica con While ---
|
|
def get_multiplier_while(i, multiplier, primes, p_len, jumps, jump):
|
|
value = (i + multiplier + primes[(i + jump) % p_len]) & 0x3FFFFFFF
|
|
count = 0
|
|
while count < jumps:
|
|
shift = 13 + i % 8
|
|
if i & 1:
|
|
value ^= (value >> shift)
|
|
else:
|
|
value ^= (value << shift)
|
|
value = (value + primes[i := (i + jump) % p_len]) & 0x3FFFFFFF
|
|
count += 1
|
|
return value
|
|
|
|
def get_multiplier_callback(multiplier, primes, p_len, jumps, jump, i = 0):
|
|
value = ((value ^ (
|
|
value >> shift if i & 1 else value << shift
|
|
)) + self.__primes[
|
|
i := (i + self.__multiplier_jump) % self.__primes_l
|
|
]) & 0x3FFFFFFF
|
|
|
|
# --- Configuración del Test ---
|
|
primes = (0x3FFFFFFB, 0x3FFFFF29, 0x3FFFFF0B, 0x2FFFFFFF, 0x2FFFFF5B)
|
|
setup_code = """
|
|
from __main__ import get_multiplier_current, get_multiplier_fast, primes
|
|
import secrets
|
|
"""
|
|
|
|
# Ejecución de 1 millón de iteraciones
|
|
n = 1_000_000
|
|
|
|
t_current = timeit.timeit(lambda: get_multiplier_current(5, 1, primes, 5, 3, 7), setup=setup_code, number=n)
|
|
t_fast = timeit.timeit(lambda: get_multiplier_fast(5, 1, primes, 5, 7), setup=setup_code, number=n)
|
|
t_secrets = timeit.timeit(lambda: secrets.token_bytes(4), setup=setup_code, number=n)
|
|
t_while = timeit.timeit(lambda: get_multiplier_while(5, 1, primes, 5, 3, 7), setup=setup_code, number=n)
|
|
|
|
print(f"--- Resultados ({n} iteraciones) ---")
|
|
print(f"Anyanka (Bucle): {t_current:.4f} seg")
|
|
print(f"Anyanka (Unrolled): {t_fast:.4f} seg")
|
|
print(f"Secrets (Cripto): {t_secrets:.4f} seg")
|
|
print(f"Anyanka (While): {t_while:.4f} seg") |