Хорошо, я знаю, что мое пространство паролей соответствует следующему: pattern = re.compile ('[AZ, az] {6,8} [0-9] {1,2} $')
и я знаю, что для эффективной функции сокращения он должен сопоставить любой хэш обратно с паролем в моем домене, и он должен быть максимально равномерным.Я также знаю, что когда я расширяю каждую цепочку в радужной таблице, мне нужно каждый раз использовать другую функцию сокращения.Вместо того чтобы писать 256 функций сокращения, я подумал, что я бы как-то итерировал свою функцию сокращения, но, очевидно, лучший способ сделать это, чтобы предотвратить столкновения и слияния цепей.
Моя текущая функция сокращения в неитеративной форме:
#decToCharDictionary takes a number 0-52 and returns a char assigned to it from a-Z
def reduce(hashVal, decToCharDictionary):
newPass = ""
baseCharLength = 6
baseNumLength = 1
#this portion allows passwords of 6-8 letters with 1-2 numbers to be uniform to all possible passwords
letterLength = (int(hashVal[1:2], 16) % 3) + 6
numberLength = (int(hashVal[4:5], 16) % 2) + 1
baseOffset = 7
for x in range(letterLength):
startIndex = baseOffset + (x * 3)
letterVal = int(hashVal[startIndex: (startIndex + 2)], 16) % 52
letter = decToCharDictionary.get(letterVal)
newPass = newPass + "" + letter
baseOffset = 2
for x in range(numberLength):
startIndex = baseOffset + (x * 3)
digit = int(hashVal[startIndex: (startIndex + 2)], 16) % 10
newPass = newPass + "" + str(digit)
return newPass
Как бы я мог выполнить итерацию этой функции сокращения в соответствии со своими потребностями без снижения производительности, возможно ли вообще выполнить итерацию и избежать коллизий для 256 ссылок в цепочке?