TGViewer
DEV: Рубиновые тона DEV: Рубиновые тона @dev_in_ruby_colors · 3.28K subscribers
Post #752 1.14K
Я тут потихоньку готовлю пару уроков про хэши и прочее, и пока для интереса сделал простую реализацию для алгоритма Луна. Это довольно интересный, но простой принцип свёртки, который можно использовать для быстрой проверки корректности разных кодов, кредитных карт и прочего.

Грубо говоря, если у нас есть какой-то длинный идентификатор (код) из цифр, мы можем сделать для него контрольный разряд. Делается так:

1) Берём каждую цифру из кода по очереди, начиная с самой правой

2) Суммируем эти цифры, но каждый второй элемент предварительно умножаем на 2, начиная с самого правого. Так, если есть последовательность "1234", то выходит что-то в духе "4 * 2 + 3 + 2 * 2 + 1".

3) Если в результате умножения на 2 вышло число > 10, то просто суммируем его разряды (к примеру, если 14, то делаем 1 + 4)

4) Получившийся результат R используем в формуле (R mod 10) - или аналогичной, там их много

5) Итог и будет контрольным разрядом, который дописывается в конец кода

6) Для проверки корректности этого разряда достаточно применить операцию к коду ещё раз (предварительно отбросив код)

К примеру, имея код

"1369"

получаем

(9 * 2) + 6 + (3 * 2) + 1

18 + 6 + 6 + 1

(1 + 8) + 6 + 6 + 1

22

(22 mod 10) = 2

2 и будет контрольным битом для всей свёртки. Забавно, так как подобный алгоритм позволяет защитить от некоторых типичных опечаток при вводе кодов, номеров кредиток и прочего, хотя, к сожалению, не от всех.

Можно написать простую реализацию (хотя и наивную)

class Luhn
def add_validation_to(code)
"#{code}#{check_digit_for(code)}"
end

def valid?(code)
code_chars = code.to_s.chars

check_digit_for(code_chars[0...-1]) == code_chars[-1].to_i
end

private

def check_digit_for(code)
digest = code.to_s.chars.reverse.map(&:to_i).inject(0) do |res, num|
res + num.divmod(10).sum
end

digest % 10
end
end

luhn = Luhn.new

validated = luhn.add_validation_to('12345')

puts luhn.valid?(validated)
  • 👍 17
  • 🌚 10
  • 🔥 4
  • ❤ 1
More from @dev_in_ruby_colors
  1. Oct 4, 2026В этом уроке по абстрактной алгебре говорим про ideals (идеалы), factor (quotient) rings и…
  2. Sep 28, 2026Github буйствует
  3. Sep 26, 2026В этом уроке по абстрактной алгебре говорим про области целостности, делители нуля, характ…
  4. Sep 22, 2026А тем временем сказ о ведьмаке, потерявшем память, уже доступен в виде аудиокниги. Целых 1…
  5. Sep 20, 2026В этом уроке по абстрактной алгебре продолжаем говорить о кольцах: в частности о subrings…
  6. Sep 17, 2026Сделал обзор актуальных библиотек JS для сбора данных, 10 штук бодрых решений на все случа…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →