autocomplete="off"
должен работать, но вместо того, чтобы работать и, учитывая, что это не пароль или электронная почта, вы могли бы указать ему случайную строку, чтобы посмотреть, поможет ли это
Например autocomplete="rjftgh"
Я не уверен, что вы пропустили, где в этой документации написано «^ обозначает возведение в степень» (не xor).
Каждый раз в цикле предыдущее значение хэша умножается на 31 снова перед добавлением к следующему элементу значения
.
Можно было бы доказать, что эти вещи равны по индукции, но я думаю, что пример может быть более ясно:
Скажем, мы имеем дело со строкой из 4 символов. Давайте развернем цикл:
hash = 0;
hash = 31 * hash + value[0];
hash = 31 * hash + value[1];
hash = 31 * hash + value[2];
hash = 31 * hash + value[3];
Теперь скомбинируем их в один оператор, подставив каждое значение хэша в следующий оператор:
hash = 31 * (31 * (31 * (31 * 0 + value[0]) + value[1]) + value[2])
+ value[3];
31 * 0 равен 0, поэтому упростим:
hash = 31 * (31 * (31 * value[0] + value[1]) + value[2])
+ value[3];
Теперь умножим два внутренних члена на эту секунду 31 :
hash = 31 * (31 * 31 * value[0] + 31 * value[1] + value[2])
+ value[3];
Теперь умножьте три внутренних члена на эти первые 31:
hash = 31 * 31 * 31 * value[0] + 31 * 31 * value[1] + 31 * value[2]
+ value[3];
и преобразуйте в экспоненты (больше не Java):
hash = 31^3 * value[0] + 31^2 * value[1] + 31^1 * value[2] + value[3];
развернуть цикл. Затем вы получите:
int hash = 0;
hash = 31*hash + value[0];
hash = 31*hash + value[1];
hash = 31*hash + value[2];
hash = 31*hash + value[3];
...
return hash;
Теперь вы можете выполнить некоторые математические манипуляции, вставив 0 для начального значения хеш-функции:
hash = 31*(31*(31*(31*0 + value[0]) + value[1]) + value[2]) + value[3])...
Упростите его еще немного:
hash = 31^3*value[0] + 31^2*value[1] + 31^1*value[2] + 31^0*value[3]...
И это по сути исходный алгоритм.
Доказательство по индукции:
T1(s) = 0 if |s| == 0, else s[|s|-1] + 31*T(s[0..|s|-1])
T2(s) = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
P(n) = for all strings s s.t. |s| = n, T1(s) = T2(s)
Let s be an arbitrary string, and n=|s|
Base case: n = 0
0 (additive identity, T2(s)) = 0 (T1(s))
P(0)
Suppose n > 0
T1(s) = s[n-1] + 31*T1(s[0:n-1])
T2(s) = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] = s[n-1] + 31*(s[0]*31^(n-2) + s[1]*31^(n-3) + ... + s[n-2]) = s[n-1] + 31*T2(s[0:n-1])
By the induction hypothesis, (P(n-1)), T1(s[0:n-1]) = T2(s[0:n-1]) so
s[n-1] + 31*T1(s[0..n-1]) = s[n-1] + T2(s[0:n-1])
P(n)
I думаю, что у меня есть, и было запрошено доказательство.
Посмотрите на первые несколько итераций, и вы увидите, что шаблон начинает появляться:
hash0 = 0 + s0 = s0 hash1 = 31(hash0) + s1 = 31(s0) + s1 hash2 = 31(hash1) + s2 = 31(31(s0) + s1) + s2 = 312(s0) + 31(s1) + s2 ...