Это невозможно. Хэш-код для String является с потерями; многие значения String приведут к тому же хэш-коду. Целое число имеет 32 битовые позиции, и каждая позиция имеет два значения. Невозможно сопоставить даже 32-символьные строки (например) (каждый символ имеет множество возможностей) в 32 бита без коллизий. Они просто не подходят.
Если вы хотите использовать арифметику произвольной точности (скажем, BigInteger), тогда вы можете просто взять каждый символ как целое число и объединить их все вместе. Вуаля.
Каждый раз, когда вы вызываете setValue()
или updateChildren()
в качестве ссылки, это приводит к записи данных в базу данных. Это означает, что в вашем коде новый узел для нового пользователя создается после следующих операторов:
final DatabaseReference newPost3 = mDatabase3.push();
newPost3.child("userid").setValue(acct.getEmail());
Таким образом, в этот момент база данных содержит только userid
для нового узла. Поскольку узел теперь создан, ваша облачная функция сработает, и на этом этапе username
и score
будут неопределенными.
Чтобы этого не происходило, вам нужно записать весь узел для нового пользователя за один вызов в базу данных. Простой способ сделать это - поместить все данные в HashMap
:
Map<String, Object> values = new HashMap<String, Object>();
values.put("userid", acct.getEmail());
values.put("desc", finalValue);
values.put("username", acct.getDisplayName());
mDatabase3.push().setValue(values);