Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

2.25. Кодирование и декодирование строк в кодировке rot13

Rot13 — наверное, самый слабый из известных человечеству шифров. Исторически он просто препятствовал «случайному» прочтению текста. Он часто встречается в конференциях Usenet; например, так можно закодировать потенциально обидную шутку или сценарий фильма «Звездные войны. Эпизод 13» накануне премьеры. Принцип кодирования состоит в смещении символов относительно начала алфавита (латинского) на 13: А превращается в N, В — в О и т.д. Строчные буквы смещаются на ту же величину; цифры, знаки препинания и прочие символы игнорируются. Поскольку 13 — это ровно половина

от 26 (число букв в латинском алфавите), то функция является обратной самой себе, то есть ее повторное применение восстанавливает исходный текст.

Ниже приведена реализация этого метода, добавленного в класс

String
, никаких особых комментариев она не требует:

class String

 def rot13

self.tr("A-Ma-mN-Zn-z","N-Zn-zA-Ma-m")

 end

end

joke = "Y2K bug"

joke13 = joke.rot13 # "L2X oht"

episode2 = "Fcbvyre: Naanxva qbrfa'g trg xvyyrq."

puts episode2.rot13

2.26. Шифрование строк

Иногда нежелательно, чтобы строки можно было легко распознать. Например, пароли не следует хранить в открытом виде, какими бы ограничительными ни были права доступа к файлу.

В стандартном методе crypt применяется стандартная функция с тем же именем для шифрования строки по алгоритму DES. Она принимает в качестве параметра «затравку» (ее назначение то же, что у затравки генератора случайных чисел). На платформах, отличных от UNIX, параметр может быть иным.

Ниже показано тривиальное приложение, которое запрашивает пароль, знакомый любителям Толкиена:

coded = "hfCghHIE5LAM."

puts "Говори, друг, и жми Enter!"

print "Пароль: " password = gets.chop

if password.crypt("hf") == coded

 puts "Добро пожаловать!"

else

 puts "Кто ты, орк?"

end

Стоит отметить, что на такое шифрование не стоит полагаться в серверных Web-приложениях, поскольку пароль, введенный в поле формы, все равно передаётся по сети в открытом виде. В таких случаях проще всего воспользоваться протоколом SSL (Secure Sockets Layer). Разумеется, никто не запрещает пользоваться шифрованием на сервере, но по другой причине — чтобы защитить пароль в хранилище, а не во время передачи по сети.

2.27. Сжатие строк

Для сжатия строк и файлов применяется библиотека Zlib.

Зачем может понадобиться сжимать строки? Возможно, чтобы ускорить ввод/вывод из базы данных, оптимизировать использование сети или усложнить распознавание строк.

В классах

Deflate
и
Inflate
имеются методы класса
deflate
и
inflate
соответственно. У метода
deflate
(он
выполняет сжатие) есть дополнительный параметр, задающий режим сжатия. Он определяет компромисс между качеством сжатия и скоростью. Если значение равно
BEST_COMPRESSION
, то строка сжимается максимально, но это занимает сравнительно много времени. Значение
BEST_SPEED
задает максимальную скорость, но при этом строка сжимается хуже. Подразумеваемое по умолчанию значение
DEFAULT_COMPRESSION
выбирает компромиссный режим.

require 'zlib'

include Zlib

long_string = ("abcde"*71 + "defghi"*79 + "ghijkl"*113)*371

# long_string состоит из 559097 символов.

s1 = Deflate.deflate(long_string,BEST_SPEED) # 4188 символов.

s3 = Deflate.deflate(long_string) # 3568 символов

s2 = Deflate.deflate(long_string,BEST_COMPRESSION) # 2120 символов

Неформальные эксперименты показывают, что скорость отличается примерно в два раза, а плотность сжатия — в обратной пропорции на ту же величину. И скорость, и плотность сильно зависят от состава строки. Разумеется, на скорость влияет и имеющееся оборудование.

Имейте в виду, что существует пороговое значение длины строки. Если строка короче, то сжимать ее практически бесполезно (если только вы не хотите сделать ее нечитаемой). В этом случае неизбежные накладные расходы могут даже привести к тому, что сжатая строка окажется длиннее исходной.

2.28. Подсчет числа символов в строке

Метод

count
подсчитывает число вхождений в строку символов из заданного набора:

s1 = "abracadabra"

a = s1.count("с") # 1

b = s1.count("bdr") # 5

Строковый параметр ведет себя как простое регулярное выражение. Если он начинается с символа

^
, то берется дополнение к списку:

c = s1.count("^а") # 6

d = s1.count ("^bdr") # 6

Дефис обозначает диапазон символов:

e = s1.count("a-d") # 9

f = s1.count("^a-d") # 2

2.29. Обращение строки

Для обращения строки служит метод

reverse
(или его вариант для обращения «на месте»
reverse!
):

s1 = "Star Trek"

s2 = s1.reverse # "kerT ratS"

si.reverse! # si теперь равно "kerT ratS"

Пусть требуется обратить порядок слов (а не символов). Тогда можно сначала воспользоваться методом

String#split
, который вернет массив слов. В классе
Array
тоже есть метод
reverse
, поэтому можно обратить массив, а затем с помощью метода
join
объединить слова в новую строку:

Поделиться:
Популярные книги

Наследие Маозари 2

Панежин Евгений
2. Наследие Маозари
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 2

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Отмороженный 13.0

Гарцевич Евгений Александрович
13. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 13.0

Санек 2

Седой Василий
2. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 2

Хозяин оков V

Матисов Павел
5. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков V

Наследник и новый Новосиб

Тарс Элиан
7. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник и новый Новосиб

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Дитя прибоя

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Печать пожирателя 2

Соломенный Илья
2. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать пожирателя 2

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Архил…? Книга 3

Кожевников Павел
3. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
7.00
рейтинг книги
Архил…? Книга 3

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Виконт. Книга 4. Колонист

Юллем Евгений
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Виконт. Книга 4. Колонист