Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
В стандартном методе 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
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
^
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"