2015-07-16 3 views
1

Я создал зашифрованный токен от Blowfish. Например: - 7$127O$137kI$137mK$07WK$01$26m$05zYbJmCmUw$16nF$11G$27A2Gv$19Jm8$26eJ9kUv$07$118q$05$02$24KP8j$208$16$06$100P$11Как получить зашифрованный токен с минимальным значением?

Просто из любопытства, могу ли я получить этот токен более сведен к минимуму/упрощен/полосатый как-то. Можно сделать что-то, чтобы сделать это более упрощенным, может быть любая кодировка. Пожалуйста, помогите мне с этим.

Thanks

ответ

1

Попробуйте кодировку Huffman с вашей строкой. Для строки 7$127O$137kI$137mK$07WK$01$26m$05zYbJmCmUw$16nF$11G$27A2Gv$19Jm8$26eJ9kUv$07$118q$05$02$24KP8j$208$16$06$100P$11

коэффициент сжатия 0,536830357143.

Analysis 

Memory requirements: ASCII: 896 bit  , Huffman: 593 bit 
      Entropy: ASCII: 1.01833029706, Huffman: 1.05223637886 
Average code length: ASCII: 8 bit  , Huffman: 4.29464285714 bit 
Compression rate: 0.536830357143 

+---------+-------+-------+-----------+---------+---------+ 
| Seq.no. | Chars | ASCII | Frequency | Huffman | ASCII | 
+---------+-------+-------+-----------+---------+---------+ 
|  0 | '$' | 36 |  22 |  0 | 100100 | 
|  1 | '0' | 48 |  10 | 1111 | 110000 | 
|  2 | '1' | 49 |  14 |  11 | 110001 | 
|  3 | '2' | 50 |   8 | 1011 | 110010 | 
|  4 | '3' | 51 |   2 | 110100 | 110011 | 
|  5 | '4' | 52 |   1 | 101111 | 110100 | 
|  6 | '5' | 53 |   2 | 111001 | 110101 | 
|  7 | '6' | 54 |   5 |  100 | 110110 | 
|  8 | '7' | 55 |   7 | 1000 | 110111 | 
|  9 | '8' | 56 |   4 | 11011 | 111000 | 
|  10 | '9' | 57 |   2 | 110011 | 111001 | 
|  11 | 'A' | 65 |   1 | 1100001 | 1000001 | 
|  12 | 'C' | 67 |   1 | 1100000 | 1000011 | 
|  13 | 'F' | 70 |   1 | 1001100 | 1000110 | 
|  14 | 'G' | 71 |   2 | 110101 | 1000111 | 
|  15 | 'I' | 73 |   1 | 101110 | 1001001 | 
|  16 | 'J' | 74 |   3 | 1010 | 1001010 | 
|  17 | 'K' | 75 |   3 | 10010 | 1001011 | 
|  18 | 'O' | 79 |   1 | 1010001 | 1001111 | 
|  19 | 'P' | 80 |   2 | 110010 | 1010000 | 
|  20 | 'U' | 85 |   2 | 101010 | 1010101 | 
|  21 | 'W' | 87 |   1 | 1100010 | 1010111 | 
|  22 | 'Y' | 89 |   1 | 1001101 | 1011001 | 
|  23 | 'b' | 98 |   1 | 1010000 | 1100010 | 
|  24 | 'e' | 101 |   1 | 1100011 | 1100101 | 
|  25 | 'j' | 106 |   1 | 10110 | 1101010 | 
|  26 | 'k' | 107 |   2 | 101001 | 1101011 | 
|  27 | 'm' | 109 |   5 | 11101 | 1101101 | 
|  28 | 'n' | 110 |   1 | 1001110 | 1101110 | 
|  29 | 'q' | 113 |   1 | 1001111 | 1110001 | 
|  30 | 'v' | 118 |   2 | 111000 | 1110110 | 
|  31 | 'w' | 119 |   1 | 1010110 | 1110111 | 
|  32 | 'z' | 122 |   1 | 1010111 | 1111010 | 
+---------+-------+-------+-----------+---------+---------+ 
1

Хаффман имеет статическую стоимость, стол Хаффмана. С другой стороны, алгоритмы семейства Lempel-Ziv имеют очень хорошее сжатие и производительность.

Если строка будет английский текст лучше использовать Smaz: https://github.com/antirez/smaz/tree/master

+0

Попробуйте запустить с smaz. 's =" 7 $ 127O $ 137kI $ 137mK $ 07WK $ 01 $ 26m $ 05zYbJmCmUw $ 16nF $ 11G $ 27A2Gv $ 19Jm8 $ 26eJ9kUv $ 07 $ 118q $ 05 $ 02 $ 24KP8j $ 208 $ 16 $ 06 $ 100P $ 11 "; ratio = smaz.compress (s) .length/s.length; 'the ** ratio равно 0.835820895522388 ** – Willmore

+0

Посмотрите на алгоритмы Lempel-Ziv, чтобы улучшить соотношение. Smaz лучше всего для английского текста, из-за конкретной оптимизации. – lostcitizen

+0

С сжатием lzw (см. Http://stackoverflow.com/a/294421/1737819) с данным соотношением ** ** - 0.7767857142857143 **. И строка вывода '7 $ 127Oā37kIĆ7mK $ 07WĎ01 $ 26mď5zYbJmCmUwā6nFā1GĖ7A2Gvā9ğ8Ė6eJ9kUıĐĩ8qĚď2Ė4KP8jĖ0ĵ16ďŏ100Pĩ'. И победитель LZW. :) – Willmore