Числа произвольной точности и Javascript, Google Web Toolkit

На самом деле это не вопрос, так как у меня есть работа с этой проблемой, но я подумал, что сообщу всем, потому что это может иметь довольно большое влияние на то, как люди работают с Google Web Toolkit.

Итак, одна из проблем заключается в том, как Google gson представляет числа в JSON. Например, int myInt = 2 станет "myInt":2, long myLong = 5432198765L станет "myLong":5432198765, а BigInteger myBI = 1310381093810938109481049128409487109378109248104098130981039810983 станет "myBI":1310381093810938109481049128409487109378109248104098130981039810983. Хотя сам gson может десериализовать это без проблем, фреймворку AutoBeans в GWT 2.4 в JSON это не понравится. Исправление ошибки 6331. это для длительного представления в предстоящем выпуске GWT 2.5. Однако проблема 7555 не будет разрешено из-за того, как работает точность чисел Javascript.

Таким образом, нам нужно будет представить BigInteger как строки, и это будет работать, например, String myBIStr = new BigInteger("1310381093810938109481049128409487109378109248104098130981039810983").toString() будет представлен как "myBIStr":"1310381093810938109481049128409487109378109248104098130981039810983". В конце GWT это приведет к String, и нам придется построить из нее BigInteger.

Все имеет смысл, почему Google не разрешает 7555, но это подводит меня к настоящему открытому вопросу: как работать с числами высокой точности в Javascript?

В общем, если веб-интерфейсы Javascript и Google Web Toolkit бросают вызов собственным интерфейсам, тогда могут возникнуть ситуации, когда мы работаем с числами произвольной точности, вместо того, чтобы ограничиваться примерно 53-битной точностью, которая комментарий 3 беседы о. Что еще хуже, разве это ограничение не влияет на node.js или любой другой Javascript на стороне сервера?

Есть ли хороший способ обхода, особенно тот, который использует или без проблем работает с Google Web Toolkit?


person xtremebytes    schedule 03.08.2012    source источник


Ответы (1)


GWT может выполнять математические вычисления с целыми числами шириной более 53 бит, потому что он имитирует Long (и, как мне кажется, BigInteger). Математика медленнее, так как она не может просто использовать собственные операции JS, но здесь нет жесткого ограничения.

Итак, GWT уже реализовал обходной путь, и он встроен. Вам просто нужно избегать передачи числового JSON, когда вам нужно большое целое число.

person Riley Lark    schedule 03.08.2012
comment
Однако я попытался использовать BigIntegers в реализации криптосистемы, но это не удалось. Однако та же реализация отлично работает на стандартной Java. - person xtremebytes; 03.08.2012
comment
Под неудачным я имею в виду: например, он остановился на этапе генерации ключа. Просто на вычисление больших простых чисел ушло много времени, и в конце концов Javascript перестал отвечать. На самом деле это не удалось даже с 128-битной криптосистемой с открытым ключом. Я заметил, что BigInteger поддерживается GWT, поэтому я подумал, что могу просто поработать с ними, но не смог. - person xtremebytes; 03.08.2012
comment
Это неподходящая задача для javascript. Это не удается, потому что очень медленно работать с большими числами, и вы выполняете много операций с большим количеством больших чисел. - person Riley Lark; 03.08.2012
comment
Библиотека JSBN из Стэнфорда реализует большие числа, достаточно оптимизированные для Javascript. Вот пример криптосистемы, использующей это: bitpuzzle.com/tmp/47252cb0ddmitcaa147/ / demo /. Интересно, почему в GWT не добавлены оптимизации JSBN. - person xtremebytes; 16.07.2013