Вопрос по большим числам и sha256


#1

Есть маленький свервис с одной задачей, найти лучший вариант

Есть вопрос, можно ли как-то упростить, я не работал с криптографией, может у кого есть опыт?
Тут очень большие цифры, что ярилось писать конвертер хекса в децимал, есть ли варианты как это сделать по другому, так как точно снижается?

Адаптировал жава для андройда

struct SearchService {
    let hexCharacters: [Character] = [
        "0", "1", "2", "3", "4", "5",
        "6", "7", "8", "9", "A", "B",
        "C", "D", "E", "F"
    ]
    let twoPower256: Decimal = pow(2, 256)
    
    init() { }
    
    func search(for text: String) -> Double? {
        guard let data = text.data(using: .utf8) else { return nil }
        let digestData = digest(input: data as NSData)
        let hexString = hex(from: digestData)
        guard let hexInDecimal = hexToDecimal(hex: hexString) else { return nil }
        let division = hexInDecimal / twoPower256
        return Double(truncating: NSDecimalNumber(decimal: division))
    }
    
    func digest(input: NSData) -> NSData {
        let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
        var hash = [UInt8](repeating: 0, count: digestLength)
        CC_SHA256(input.bytes, UInt32(input.length), &hash)
        return NSData(bytes: hash, length: digestLength)
    }
    
    func hex(from data: NSData) -> String {
        return data.reduce(into: String(), { (result, byte) in
            let c1: Character = hexCharacters[Int(byte >> 4)]
            let c2: Character = hexCharacters[Int(byte & 0x0F)]
            result.append(c1)
            result.append(c2)
        })
    }
    
    func hexToDecimal(hex: String) -> Decimal? {
        var decimal = Decimal(0)
        let reversedCharacters: [String] = Array<Character>(hex).reversed().map { "\($0)" }
        for (index, char) in reversedCharacters.enumerated() {
            guard let hex = UInt8(char, radix: 16) else { return nil }
            decimal += Decimal(hex) * pow(16, index)
        }
        return decimal
    }
}