Как вычислить разногласия коллизии в хеш-алгоритмах?

Для начала я бы поставил точку останова и посмотрел, как выглядит ваш объект ответа с любой конечной точки, на которую вы попали. Возможно, это действительно первые три элемента массива?

Переходя к конкретному вопросу, я бы использовал протокол Codable для расшифровки вашего ответа. Я пропущу часть Alamofire и сосредоточусь исключительно на расшифровке объекта. Используя ваш пример, вот как будет выглядеть структура:

struct ResponseObject: Codable {
    let name: String
    let location: String
}

Я бы не использовал оператор взрыва (!) в вашем коде, так как вы сгенерируете исключение, если скажете компилятору, что это 100% гарантированных денег в банке объект не ноль и это на самом деле. Вместо этого разверните дополнительные.

Вам понадобится место для ваших декодированных данных, чтобы вы могли объявить пустой массив ответов следующим образом:

var arrayOfObjects: [ResponseObject] = []

Затем вы просто объявите декодер и расшифруете свои данные. :

let decoder = JSONDecoder()

do {
    if let data = rawData {
        arrayOfObjects = try decoder.decode([ResponseObject].self, from: data)
        print("number of objects:", arrayOfObjects.count)
        let slice = arrayOfObjects.prefix(3)
        arrayOfObjects = Array(slice)
        print("number of objects after slicing the array:", arrayOfObjects.count)
    }
} catch {
    print(error)
}

Вместо циклического перемещения по массиву, просто возьмите первые три элемента массива с помощью .prefix(3). Поигравшись с этим только сейчас, я попытался добавить к первым 10 элементам массива префикс с 4, и он не сгенерировал исключение, поэтому я думаю, что это должно сработать без предварительной проверки счетчика массива.

Я бы посоветовал взглянуть на документацию Swift онлайн по адресу: Arrays, или вы можете получить довольно симпатичное приложение для Mac OS под названием Dash, которое позволяет вам загружать наборы документов для нескольких языков на вашем компьютере локально.

Удачи!

20
задан Pete Kirkham 25 March 2009 в 15:36
поделиться

4 ответа

11
ответ дан 30 November 2019 в 01:06
поделиться

Сначала вычислите вероятность, что нет коллизии:

hashes_picked = 100
single_collision_odds = 50000

# safe_combinations is number of ways to pick hashes that don't overlap
safe_combinations = factorial(single_collision_odds) / factorial(single_collision_odds - hashes_picked)

# all_combinations is total number of ways to pick hashes
all_combinations = single_collision_odds ** hashes_picked   

collision_chance = (all_combinations - safe_combinations) / all_combinations
5
ответ дан 30 November 2019 в 01:06
поделиться

Это много походит на День рождения Paradox мне.

Необходимо смочь просто заменить набором возможных дней рождения (365) с возможными хешами (50000) и выполнить те же вычисления, которые они представляют там.

Если Вы изменяете сценарий Python, представленный в статье для Ваших значений:

 def bp(n, d):
    v = 1.0
    for i in range(n):

         v = v * (1 - float(i)/d)
    return 1 - v

 print bp(2, 50000)

Вы заканчиваете с разногласиями коллизии на двух числах 0,00002. Приблизительно 265 образцов, у Вас есть приблизительно 50%-й шанс наличия коллизии.

5
ответ дан 30 November 2019 в 01:06
поделиться

Это называют проблемой Дня рождения. Для решения его думайте вместо этого о разногласиях того, чтобы там быть никакими коллизиями (назовите это PNC).

  • PNC (1) = 1
  • PNC (2) = 1 - ПК (2)
  • PNC (3) = PNC (2) * PNC (2) * PNC (2)
1
ответ дан 30 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: