Действительно ли assertEquals метод Java надежен?

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

, Как упомянуто в некоторых ответах, необходимо сделать PIN достаточно случайным, независимо если Вы хотите генерировать его из алгоритма. Случайность обычно измеряется энтропия из PIN.

Теперь, скажем, Ваш PIN имеет энтропию N, и существует 2^M пользователи в Вашей системе ( М < N), вероятность, что случайное предположение приведет к допустимому PIN, 2^ {M-N} . (Извините за латексные нотации я надеюсь, что это достаточно интуитивно). Тогда оттуда можно определить, дана ли та вероятность низко достаточно N и M, или вычислите необходимое N от желаемой вероятности и M.

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

194
задан isherwood 3 April 2019 в 08:25
поделиться

7 ответов

Вы должны всегда использовать .equals () при сравнении строк в Java.

JUnit вызывает ] .equals () для определения равенства в методе assertEquals (Object o1, Object o2) .

Таким образом, вы определенно в безопасности, используя assertEquals (string1, string2) . (Поскольку String s являются Object s)

Вот ссылка на отличный вопрос о стеке относительно некоторых различий между == и .equals () .

267
ответ дан 23 November 2019 в 05:25
поделиться

assertEquals для сравнения использует метод равно . Существует другое утверждение, assertSame , в котором используется оператор == .

Чтобы понять, почему == не следует использовать со строками, которые вам нужны чтобы понять, что делает == : он выполняет проверку личности. То есть a == b проверяет, относятся ли a и b к тому же объекту . Он встроен в язык, и его поведение не может быть изменено разными классами. С другой стороны, метод равно может быть отменен классами. Хотя его поведение по умолчанию (в классе Object ) заключается в выполнении проверки личности с использованием оператора == , многие классы, включая String , замените его, чтобы вместо этого выполнить проверку «эквивалентности». В случае String , вместо проверки того, относятся ли a и b к одному и тому же объекту, a.equals (b) проверяет чтобы увидеть, являются ли объекты, на которые они ссылаются, являются строками, содержащими одни и те же символы.

Время аналогии: представьте, что каждый объект String представляет собой лист бумаги с чем-то написанным на нем. Допустим, у меня есть два листка бумаги с надписью «Foo» и еще один с надписью «Bar». Если я возьму первые два листа бумаги и использую == для их сравнения, он вернет false , потому что, по сути, спрашивается: «Это один и тот же лист бумаги?». Это не Не нужно даже смотреть на то, что написано на бумаге. Тот факт, что я даю ему два листа бумаги (а не один и тот же дважды), означает, что он вернет false . Однако если я использую равно , метод равно прочитает два листа бумаги и увидит, что они говорят одно и то же ("Foo"), и вернет true .

Немного, что сбивает с толку со строками, заключается в том, что в Java есть концепция «интернирования» строк, и это (эффективно) автоматически выполняется для любых строковых литералов в вашем коде. Это означает, что если в вашем коде есть два эквивалентных строковых литерала (даже если они принадлежат разным классам), они фактически оба будут ссылаться на один и тот же объект String .

30
ответ дан 23 November 2019 в 05:25
поделиться

В двух словах - у вас может быть два объекта String, которые содержат одинаковые символы, но являются разными объектами (в разных местах памяти). Оператор == проверяет, указывают ли две ссылки на один и тот же объект (область памяти), но метод equals () проверяет, совпадают ли символы.

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

7
ответ дан 23 November 2019 в 05:25
поделиться

Да, он все время используется для тестирования. Очень вероятно, что среда тестирования использует .equals () для подобных сравнений.

Ниже приведена ссылка, объясняющая «ошибку равенства строк». По сути, строки в Java являются объектами, и когда вы сравниваете равенство объектов, обычно они сравниваются на основе адреса памяти, а не содержимого. Из-за этого две строки не будут занимать один и тот же адрес, даже если их содержимое идентично, поэтому они не будут соответствовать правильно, даже если они выглядят одинаково при печати. ​​

http://blog.enrii.com / 2006/03/15 / java-string-equal-common-error /

3
ответ дан 23 November 2019 в 05:25
поделиться
public class StringEqualityTest extends TestCase {
    public void testEquality() throws Exception {
        String a = "abcde";
        String b = new String(a);
        assertTrue(a.equals(b));
        assertFalse(a == b);
        assertEquals(a, b);
    }
}
3
ответ дан 23 November 2019 в 05:25
поделиться

JUnit assertEquals (obj1, obj2) действительно вызывает ] obj1.equals (obj2) .

Также существует assertSame (obj1, obj2) , который выполняет obj1 == obj2 (то есть проверяет, что obj1 и obj2 ссылаются на тот же экземпляр ), чего вы пытаетесь избежать.

Так что все в порядке.

3
ответ дан 23 November 2019 в 05:25
поделиться

«Оператор == проверяет, являются ли два объекта одним и тем же объектом

http : //leepoint.net/notes-java/data/strings/12stringcomparison.html

Строка - это объект в java, поэтому он попадает в эту категорию правил сравнения.

0
ответ дан 23 November 2019 в 05:25
поделиться
Другие вопросы по тегам:

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