Есть маленький свервис с одной задачей, найти лучший вариант
Есть вопрос, можно ли как-то упростить, я не работал с криптографией, может у кого есть опыт?
Тут очень большие цифры, что ярилось писать конвертер хекса в децимал, есть ли варианты как это сделать по другому, так как точно снижается?
Адаптировал жава для андройда
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
}
}