Вы должны определить метод для массива из необязательных элементов и тип возвращаемого значения в качестве соответствующего массива необязательных. Это можно сделать с помощью универсальной функции:
extension Array {
public func removeNilElements<T>() -> [T] where Element == T? {
let noNils = self.compactMap { [110] }
return noNils
}
}
Пример:
let a = [1, 2, nil, 3, nil, 4] // The type of a is [Int?]
let b = a.removeNilElements() // The type of b is [Int]
print(b) // [1, 2, 3, 4]
В вашем коде [112]
имеет (необязательный) тип Element
, и это только что обернутый компилятором в необязательный для соответствия типу аргумента compactMap()
.
По определению случайность криптографически сильного PRNG не должна быть затронута виртуализацией. Как Вы упоминаете, различие между/dev/random и/dev/urandom [касательно: http://en.wikipedia.org/wiki/Urandom/] - то, что операция чтения на/dev/random заблокируется, если система собрала недостаточную энтропию для создания желаемого объема случайных данных. Можно также записать в/dev/random для смешивания собственных данных в энтропийный пул.
Спасибо.
Из того, что я понимаю, что система, которая полагается на сеть I/O для энтропии, восприимчива к человеку в средних нападениях. Я нашел следовать статью, которая обсуждает соответствующие источники энтропии. Их предложение состоит в том, чтобы удалить сеть I/O из ядра Linux из-за его чувствительности.
Я думаю, что означает, что существует возможность для использования общих аппаратных средств в виртуализированной среде. Шанс увеличен, если сеть I/O используется. Иначе это достаточно низко для не вызывания беспокойство для всех кроме самого безопасного из приложений. В таких экземплярах это, вероятно, более безопасный разместить Ваше собственное приложение так или иначе.
Я не мог найти ссылки быстро, но мне будет казаться, что энтропия получена из структур данных ядра для устройств, не самих существующих устройств. Так как они были бы независимы независимо от виртуализации, я подозреваю, что ответ не очень.
[РЕДАКТИРОВАНИЕ] После заглядывания на источник ядра (на самом деле исправляют историю), похоже, что Linux, по крайней мере, собирает энтропию из нажатий клавиатуры, действия мыши, синхронизации прерывания (но не все прерывания), и времена окончания запроса блочного устройства. В виртуализированной системе я подозреваю, что мышь/события клавиатуры была бы довольно низкой и таким образом не способствовала бы собранной энтропии. По-видимому, это было бы смещено дополнительным действием прерывания сети I/O, но это не ясно. В этом отношении я не думаю, что это отличается очень от сервера non-VM.