действительно ли необходимо выпустить NSInteger в iPhone?

Алгоритм

Для генерации случайной строки свяжите символы, оттянутые случайным образом из набора приемлемых символов, пока строка не достигнет желаемой длины.

Реализация

Вот некоторый довольно простой и очень гибкий код для генерации случайных идентификаторов. Read информация, которая следует для примечаний к важному приложению.

import java.security.SecureRandom;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;

public class RandomString {

    /**
     * Generate a random string.
     */
    public String nextString() {
        for (int idx = 0; idx < buf.length; ++idx)
            buf[idx] = symbols[random.nextInt(symbols.length)];
        return new String(buf);
    }

    public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public static final String lower = upper.toLowerCase(Locale.ROOT);

    public static final String digits = "0123456789";

    public static final String alphanum = upper + lower + digits;

    private final Random random;

    private final char[] symbols;

    private final char[] buf;

    public RandomString(int length, Random random, String symbols) {
        if (length < 1) throw new IllegalArgumentException();
        if (symbols.length() < 2) throw new IllegalArgumentException();
        this.random = Objects.requireNonNull(random);
        this.symbols = symbols.toCharArray();
        this.buf = new char[length];
    }

    /**
     * Create an alphanumeric string generator.
     */
    public RandomString(int length, Random random) {
        this(length, random, alphanum);
    }

    /**
     * Create an alphanumeric strings from a secure generator.
     */
    public RandomString(int length) {
        this(length, new SecureRandom());
    }

    /**
     * Create session identifiers.
     */
    public RandomString() {
        this(21);
    }

}

примеры Использования

Создают небезопасный генератор для идентификаторов с 8 символами:

RandomString gen = new RandomString(8, ThreadLocalRandom.current());

Создают безопасный генератор для идентификаторов сессии:

RandomString session = new RandomString();

Создают генератор с легкими для чтения кодами для печати. Строки более длинны, чем полные алфавитно-цифровые строки для компенсации использования меньшего количества символов:

String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx";
RandomString tickets = new RandomString(23, new SecureRandom(), easy);

Использование в качестве идентификаторов сессии

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

существует сила между длиной и безопасностью. Более короткие идентификаторы легче предположить, потому что существует меньше возможностей. Но более длительные идентификаторы используют больше устройства хранения данных и пропускной способности. Больший набор символов помогает, но мог бы вызвать проблемы кодирования, если идентификаторы включены в URL или повторно введены вручную.

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

Использование в качестве идентификаторов объектов

Не каждое приложение требует безопасности. Случайное присвоение может быть эффективным путем к нескольким объектам для генерации идентификаторов в совместно используемом пространстве без любой координации или разделения. Координация может быть медленной, особенно в кластерной или распределенной среде, и разделение пространства вызывает проблемы, когда объекты заканчиваются с долями, которые являются слишком маленькими или слишком большими.

Идентификаторы, сгенерированные, не принимая меры для создания их непредсказуемыми, должны быть защищены другими средствами, если взломщик мог бы быть в состоянии просмотреть и управлять ими, как это происходит в большинстве веб-приложений. Должна быть отдельная система авторизации, которая защищает объекты, идентификатор которых может быть предположен взломщиком без права доступа.

Уход должен быть также быть взятым для использования идентификаторов, которые достаточно долги для создания коллизий вряд ли, учитывая ожидаемое общее количество идентификаторов. Это упоминается как "парадокс дня рождения". вероятность коллизии, p, приблизительно n 2 глоток> / (2q x глоток>), где n является количеством идентификаторов, на самом деле сгенерированных, , q является количеством отличных символов в алфавите, и , x является длиной идентификаторов. Это должно быть очень небольшим числом, как 2 ‑ 50 глоток> или меньше.

Работа это показывает, что шанс коллизии среди 500k идентификаторов с 15 символами - приблизительно 2 ‑ 52 глоток>, который, вероятно, менее вероятен, чем необнаруженные ошибки от космических лучей, и т.д.

Сравнение с UUID

Согласно их спецификации, UUID не разработаны, чтобы быть непредсказуемыми, и не должен использоваться в качестве идентификаторов сессии.

UUID в их стандартном формате занимают много места: 36 символов только для 122 битов энтропии. (Не все биты "случайного" UUID выбраны случайным образом.) Случайным образом выбранная алфавитно-цифровая строка упаковывает больше энтропии во всего 21 символе.

UUID не гибки; у них есть стандартизированная структура и расположение. Это - их главное достоинство, а также их основная слабость. При сотрудничестве с внешней стороной стандартизация, предлагаемая UUID, может быть полезной. Для чисто внутреннего пользования они могут быть неэффективными.

5
задан Mick MacCallum 20 July 2014 в 16:49
поделиться

3 ответа

Нет, NSInteger не является объектом; это просто typedef для int (для 32-битных приложений) или long (для 64-битных приложений):

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif
17
ответ дан 18 December 2019 в 07:56
поделиться

NSInteger - это typedef для примитивного типа, это не объект, который может реагировать на такие методы, как сохранение или освобождение. Несмотря на то, что он назван так же, как классы Какао, такие как NSNumber или NSValue, на самом деле он обрабатывается так же, как int, float и т. Д.

3
ответ дан 18 December 2019 в 07:56
поделиться

Сообщение об ошибке дает вам хороший совет о том, как отлаживать эту проблему: установите точку останова на malloc_error_break. В Xcode откройте окно точек останова (option-cmd-B). В поле с надписью «Двойной щелчок для символа» введите malloc_error_break . Повторно запустите приложение в отладчике (выберите «Отладка» в меню «Выполнить»). Отладчик остановится на месте ошибки, о которой вы сообщили. Я бы исследовал трассировку стека на этом этапе, чтобы найти, где вы дважды освободили эту память.

0
ответ дан 18 December 2019 в 07:56
поделиться