|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
В продолжение радужных табличек и прочее. Функция преобразует хеш в ключевое слово в заданном алфавите и заданной длине. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И тест к ней. Код: java 1. 2. 3. 4. 5. 6. 7. 8.
Так вот. Что-то мне кажется что деление и остаток от деления - дороговатая операция для такого длинного целого числа. Надо-бы "ужать". Но как? Дорогие в расчетах строки я отметил маркером. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 20:50 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
mayton, alphabet.length() сделать кратным двум и делить сдвигом. Остаток находить маской + побитовое и. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 04:16 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
*кратным степени двойки ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 04:28 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Алфавит изменить невозможно. Он - задан извне. И может иметь вид самого неудобного числа. Например 127. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 09:00 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Вот думаю... что если max во много раз меньше чем длина хеша то можно хеш отсекать. Надо только посчитать сколько символов. Тогда деление длинных целых станет дешевле. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 10:28 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
>Алфавит изменить невозможно. Он - задан извне. И может иметь вид самого неудобного числа. Например 127. Тогда использовать не весь. Так можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 11:05 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Еще можно брать на 1 бит больше чем нужно. Только я не придумал, что делать с пустотами. Еще вариант, берешь на 1 бит больше чем, надо. К начальному индексу прибавляешь то, что взял. Получившийся индекс, берешь из алфавита. Если "перепрыгнул" алфавит, отнимаешь от индекса его длину. Сдвигаешь переменную хеша, повторяешь. Криво, но тут надо смотреть, как у тебя будет с распределением и устроит ли всё это. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 11:24 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Идея такая. Цепочка применений Код: java 1.
должна давать линейное распределение символов на выходе не только для хешей но и для keyworkd ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 11:28 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
mayton Цепочка применений Там оверхед будет больше, чем от делений:) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 11:35 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
crutchmaster mayton Цепочка применений Там оверхед будет больше, чем от делений:) Технологически там может быть и 100 и 1000 таких применений. В этом и суть. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 11:40 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
mayton Но как? Дорогие в расчетах строки я отметил маркером. Единственный способ их ужать - использововать функцию типа divmod, которая вычисляет частное и остаток одновременно. Ну и хорошо если она будет уметь отдельно обрабатывать случаи когда делитель - степень двойки. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 14:06 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov mayton Но как? Дорогие в расчетах строки я отметил маркером. Единственный способ их ужать - использововать функцию типа divmod, которая вычисляет частное и остаток одновременно. Ну и хорошо если она будет уметь отдельно обрабатывать случаи когда делитель - степень двойки. Это мысль. Я смотрю что в некоторых либах поддержки arbitrary precission такая функция есть https://sites.google.com/site/indy256/algo_cpp/bigint Есть похожая реализация в Java11 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigInteger.html#divideAndRemainder(java.math.BigInteger) попробую ее. Хотя интерфейс не выглядит удачным. Возврат массива. Фу-фу... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 14:12 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Сделал 2 реализации и бенчмарк. Вот с цифрой два это улучшенная версия Код: java 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:00 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:01 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Бенчмарк. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:03 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Последняя идея. Отсечь лишние буквы от хеша. Допустим для 12 символьного ключевого слова при алфавите в 34 мы сделаем 12 делений этого хеша. Код: java 1.
Целочисленное деление + мод это тяжелая операция. И облегчить ее можно разве что уменьшением самого числа. Грубо говоря. Если 12 заменить на 16 то деление - в BinHex кодировке это сдвиг на 1 hex символ. Тоесть 0x1347d73da9d496705783af314ce992137503e649a10c3b96026b00c2922440f9 / 0x10 = 0x1347d73da9d496705783af314ce992137503e649a10c3b96026b00c2922440f Тогда после 34 делений у нас остается число 0x1347d73da9d496705783af314ce992. И это шлак который не влияет на результат. Вот мне надо такую-же формулу только не кратную двоичной и hex системе. Отсечь шлак еще до деления. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:20 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
mayton Вот мне надо такую-же формулу только не кратную двоичной и hex системе. Увы, не существует в природе. У двойки с десяткой нет общих степеней. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 14:23 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Я не это имел в виду. Это - функция-шумелка. Чем лучше она шумит - тем лучше. Но мне достаточно того шума который создает часть хеша SHA-256 (уже переделал). Вот щас думаю как сделать Код: java 1.
Здесь что-то будет с логарифмом вместо икса. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 14:39 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
В теле функции cropLetters. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 14:57 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
Тут еще другая проблема. Хеш функции бывают разные. От 32бит CRC до SHA-512, и функция реверсного отображения будет иметь ограничения. Я уже думаю что это не функция. А некий объект. У которого есть инициализация. Там идут проверки на всякие границы. Максимальная длина хеша и ключа. Есть смысл вынести проверки в некую общую часть наподобие init(). Или например хеш функция может быть экзотическая. Какой-нибудь mur-mur. Или сложная где хеш применяется рекурсивно тыщу раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 16:37 |
|
Дорогая в использовании функция.
|
|||
---|---|---|---|
#18+
mayton Так вот. Что-то мне кажется что деление и остаток от деления - дороговатая операция для такого длинного целого числа. Надо-бы "ужать". Но как? Дорогие в расчетах строки я отметил маркером. Использовать сдвиги?! <:o) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2021, 07:12 |
|
|
start [/forum/topic.php?fid=59&msg=40058159&tid=2120489]: |
0ms |
get settings: |
27ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
423ms |
get tp. blocked users: |
2ms |
others: | 289ms |
total: | 817ms |
0 / 0 |