Короткий ответ: Не делайте этого
Длинный ответ: вот как будет вычисляться ключ:
Фактическим ключом будет объект java.lang.Double
поскольку ключи должны быть объектами. Вот его метод hashCode()
:
public int hashCode() {
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
Метод doubleToLongBits()
в основном принимает 8 байтов и представляет их как долго. Таким образом, это означает, что небольшие изменения в вычислении double могут означать много, и у вас будут ключевые промахи.
Если вы можете рассчитывать на определенное количество точек после точки - умножить на 10 ^ (число цифр после точки) и конвертировать в int (например, для двух цифр умножить на 100).
Это будет намного безопаснее.
Я понятия не имею, почему, но мне пришлось изменить функцию проверки на следующую, и теперь она работает.
function verify(hash, publicAddress, signature) {
const messageHash = Hash(hash);
const publicKeyPair = ec.keyFromPublic(publicAddress, 'hex'); // use the accessible public key to verify the signature
return publicKeyPair.verify(messageHash, JSON.parse(signature));
}