implement util functions
This commit is contained in:
84
src/utils.py
84
src/utils.py
@@ -1,25 +1,83 @@
|
|||||||
import secrets
|
import secrets
|
||||||
|
|
||||||
|
|
||||||
def random_number_in_range(min_val: int, max_val: int) -> int:
|
def secure_fisher_yates_shuffle(arr: list) -> list:
|
||||||
""" originally secure_rand """
|
n = len(arr)
|
||||||
return min_val + secrets.randbelow(max_val - min_val + 1)
|
for i in range(n - 1, 0, -1):
|
||||||
|
j = secrets.randbelow(i + 1)
|
||||||
|
arr[i], arr[j] = arr[j], arr[i]
|
||||||
|
return arr
|
||||||
|
|
||||||
|
|
||||||
def random_number_in_range_excluding(min_val: int, max_val: int, exclude: list[int]) -> int:
|
def generate_random_nonrepeating_list(list_len: int, min_val: int = 0, max_val: int = 2 ** 16) -> list[int]:
|
||||||
""" originally secure_rand """
|
assert(max_val-min_val >= list_len)
|
||||||
|
return secure_fisher_yates_shuffle(list(range(min_val, max_val))[:list_len])
|
||||||
return min_val + secrets.randbelow(max_val - min_val + 1)
|
|
||||||
|
|
||||||
|
|
||||||
def generate_random_list(list_len: int, min_val: int = 0, max_val: int = 255) -> list[int]:
|
def generate_random_nonrepeating_matrix(rows: int, cols: int, min_val: int = 0, max_val: int = 2 ** 16) -> list[list[int]]:
|
||||||
return [random_number_in_range(min_val, max_val) for _ in range(list_len)]
|
values = generate_random_nonrepeating_list(rows*cols, min_val, max_val)
|
||||||
|
matrix = []
|
||||||
|
idx = 0
|
||||||
def generate_random_matrix(rows: int, cols: int, min_val: int = 0, max_val: int = 255) -> list[list[int]]:
|
for _ in range(cols):
|
||||||
return [[random_number_in_range(min_val, max_val) for _ in range(rows)] for _ in range(cols)]
|
row = []
|
||||||
|
for _ in range(rows):
|
||||||
|
row.append(values[idx])
|
||||||
|
idx += 1
|
||||||
|
matrix.append(row)
|
||||||
|
return matrix
|
||||||
|
|
||||||
|
|
||||||
def xor_lists(l1: list[int], l2: list[int]):
|
def xor_lists(l1: list[int], l2: list[int]):
|
||||||
assert len(l1) == len(l2)
|
assert len(l1) == len(l2)
|
||||||
return [l2[i] ^ l1[i] for i in range(len(l1))]
|
return [l2[i] ^ l1[i] for i in range(len(l1))]
|
||||||
|
|
||||||
|
|
||||||
|
def generate_random_index_interface(height: int, width: int) -> list[list[int]]:
|
||||||
|
interface = []
|
||||||
|
idx = 0
|
||||||
|
for i in range(height):
|
||||||
|
key = []
|
||||||
|
for j in range(width):
|
||||||
|
key.append(idx)
|
||||||
|
idx += 1
|
||||||
|
key = secure_fisher_yates_shuffle(key)
|
||||||
|
interface.append(key)
|
||||||
|
return interface
|
||||||
|
|
||||||
|
|
||||||
|
def generate_serialized_index_interface(height: int, width: int) -> list[list[int]]:
|
||||||
|
interface = []
|
||||||
|
idx = 0
|
||||||
|
for i in range(height):
|
||||||
|
key = []
|
||||||
|
for j in range(width):
|
||||||
|
key.append(idx)
|
||||||
|
idx += 1
|
||||||
|
interface.append(key)
|
||||||
|
return interface
|
||||||
|
|
||||||
|
|
||||||
|
def interface_transpose(interface: list[list[int]]) -> list[list[int]]:
|
||||||
|
return [list(row) for row in zip(*interface)]
|
||||||
|
|
||||||
|
|
||||||
|
def shuffle_interface(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def disperse_interface(user_interface: list[list[int]]):
|
||||||
|
shuffled_keys = secure_fisher_yates_shuffle(user_interface)
|
||||||
|
dispersed_interface = random_attribute_rotation(shuffled_keys)
|
||||||
|
return dispersed_interface
|
||||||
|
|
||||||
|
|
||||||
|
def random_attribute_rotation(user_interface: list[list[int]]) -> list[list[int]]:
|
||||||
|
numb_attr = len(user_interface[0])
|
||||||
|
numb_keys = len(user_interface)
|
||||||
|
attr_rotation = secure_fisher_yates_shuffle(list(range(numb_keys)))[:numb_attr]
|
||||||
|
transposed_user_interface = interface_transpose(user_interface)
|
||||||
|
assert (len(attr_rotation) == len(transposed_user_interface))
|
||||||
|
for idx, attr_set in enumerate(transposed_user_interface):
|
||||||
|
rotation = attr_rotation[idx]
|
||||||
|
transposed_user_interface[idx] = attr_set[rotation:] + attr_set[:rotation]
|
||||||
|
return interface_transpose(transposed_user_interface)
|
||||||
|
|||||||
Reference in New Issue
Block a user