Ниже показано тривиальное приложение, которое запрашивает пароль, знакомый любителям Толкиена:
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
задает максимальную скорость, но при этом строка сжимается хуже. Подразумеваемое по умолчанию значение
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
объединить слова в новую строку:
phrase = "Now here's a sentence"
phrase.split(" ").reverse.join(" ")
# "sentence a here's Now"
2.30. Удаление дубликатов
Цепочки повторяющихся символов можно сжать до одного методом
squeeze
:
s1 = "bookkeeper"
s2 = s1.squeeze # "bokeper"
s3 = "Hello..."
s4 = s3.squeeze # "Helo."
Если указан параметр, то будут удаляться только дубликаты заданных в нем символов:
s5 = s3.squeeze(".") # "Hello."
Этот параметр подчиняется тем же правилам, что и параметр метода
count
(см. раздел 2.28), то есть допускаются дефис и символ
^
. Имеется также метод
squeeze!
.
2.31. Удаление заданных символов
Метод
delete
удаляет из строки те символы, которые включены в список, переданный в качестве параметра:
s1 = "To be, or not to be"
s2 = s1.delete("b") # "To e, or not to e"
s3 = "Veni, vidi, vici!"
s4 = s3.delete(",!") # "Veni vidi vici"
Этот параметр подчиняется тем же правилам, что и параметр метода
count
(см. раздел 2.28), то есть допускаются символы
–
(дефис) и
^
(каре). Имеется также метод
delete!
.
2.32. Печать специальных символов
Метод
dump
позволяет получить графическое представление символов, которые обычно не печатаются вовсе или вызывают побочные эффекты: