PageRenderTime 26ms CodeModel.GetById 16ms app.highlight 7ms RepoModel.GetById 0ms app.codeStats 1ms

/bangkokhotel/lib/python2.5/site-packages/django/utils/checksums.py

https://bitbucket.org/luisrodriguez/bangkokhotel
Python | 22 lines | 11 code | 3 blank | 8 comment | 5 complexity | 55675dafc05a3857ee55a42bbddf7654 MD5 | raw file
 1"""
 2Common checksum routines (used in multiple localflavor/ cases, for example).
 3"""
 4
 5__all__ = ['luhn',]
 6
 7LUHN_ODD_LOOKUP = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9) # sum_of_digits(index * 2)
 8
 9def luhn(candidate):
10    """
11    Checks a candidate number for validity according to the Luhn
12    algorithm (used in validation of, for example, credit cards).
13    Both numeric and string candidates are accepted.
14    """
15    if not isinstance(candidate, basestring):
16        candidate = str(candidate)
17    try:
18        evens = sum([int(c) for c in candidate[-1::-2]])
19        odds = sum([LUHN_ODD_LOOKUP[int(c)] for c in candidate[-2::-2]])
20        return ((evens + odds) % 10 == 0)
21    except ValueError:  # Raised if an int conversion fails
22        return False