forked from jdufresne/feedme
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.py
More file actions
63 lines (51 loc) · 1.74 KB
/
utils.py
File metadata and controls
63 lines (51 loc) · 1.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import string
from random import shuffle
from urlparse import urlparse
#from django.utils.encoding import smart_str
def validate_url(url):
#import pdb; pdb.set_trace()
#this only wants bytestrs
pieces = urlparse(url)
assert all([pieces.scheme, pieces.netloc])
assert set(pieces.netloc) <= set(string.letters + string.digits + '-.') # and others?
assert pieces.scheme in ['http', 'https', 'ftp']
return pieces.geturl()
class Alphabet():
def __init__(self,chars="23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ",
salt=lambda:0.03950477560662613,
min_size=6,
skip=1000 ):
_ = list(chars)
shuffle(_,salt)
self.alphabet = ''.join(_)
base = len(self.alphabet)
#the lowest number with min_size digits in this base is base^6
self.offset = base**min_size
self.skip = skip
self.base_dict = dict((c, i) for i, c in enumerate(self.alphabet))
#BASE_DICT = lambda a : dict((c, i) for i, c in enumerate(a))
def base_decode(string):
alphabet = Alphabet()
reverse_base = alphabet.base_dict
length = len(reverse_base)
ret = 0
for i, c in enumerate(string[::-1]):
ret += (length ** i) * reverse_base[c]
ret /= alphabet.skip
ret -= alphabet.offset
return ret
def base_encode(integer):
alphabet = Alphabet()
base = alphabet.alphabet
length = len(base)
ret = ''
integer += alphabet.offset
integer *= alphabet.skip
while integer != 0:
ret = base[integer % length] + ret
integer /= length
return ret
if __name__=='__main__':
nums = [0, 10 ** 10] + range(0, 1000)
for i in nums:
assert i == base_decode(base_encode(i)), '%s failed' % i