# 35aca863-a674-3803-9b98-228864642098",18446744005159871776,"T"],["ac8f29f5-8e3e-3234-a3b8-5da7103a1b1a",18446744005122523136,"T"],["00000000-0000-0000-0000-000000000000",0,"A"],["1c67ea89-6c80-3ae8-acb4-088957678249",18446744005143965264,"T"],["d0250b1d-d8e3-335a-91a8-4dd41147130e",18446744005157420496,"T"],["cbc282e1-6b20-34ca-8fc7-87df41e16eef",18446744005157389616,"T"],["39c1b102-8748-3532-bb9f-32e2c62f3706",18446744005132814208,"T"],["69e78b4a-6673-3c59-9dd5-79a01fa700a3",18446744005132141616,"T"],["63bcce99-2955-3db0-aa71-bb33651ce3c0",18446744005141581616,"T"],["76a66de4-fa2f-347a-a8ba-234e0ea69604",18446744005140288880,"T"],["c7b128d5-8786-3a97-9942-b9e1e5327c10",18446744005157913968,"T"],["bea9964d-c325-3dc1-86f7-1465d9761d37",18446744005142294784,"T"],["35385611-fb21-34e2-bbf2-315d03493c43",18446744005150341376,"T"],["1ca1baff-3a37-3759-adad-e8d644586eda",18446744005137526400,"T"],["89c9606d-50e3-375d-a636-7de8892a3a1a",18446744005138183120,"T"],["c30ff694-2842-387b-90f8-765a8adf986d",18446744005143060608,"T"],["a42145b5-f303-399b-9124-fbd5d9ac2229",6442450944,"S"],["4cb7ccbe-3939-377c-9c36-08ec8d582151",4305190912,"P"],["26644f7f-d042-38c5-929d-0232c1a43eab",4306780160,"P"],["6d24c5c4-666a-3d85-9c2c-c74150028372",4324982784,"P"],["2285e029-5ba5-3b6d-8064-19e974b69c71",4367040512,"P"],["779af808-e7fa-38c0-848f-aea7b8f57925",4332519424,"P"],["df6a0bb6-7f7e-3d63-bb1b-c9cd80f0a24d",4334223360,"P"],["c1b8a64d-8d53-36cf-a1c0-f87351a5be7f",4334911488,"P"],["e746b5f5-f78d-3a25-bf51-5adcaab82382",4344774656,"P"],["1abad528-6868-368f-94d3-e6523b8fb77c",4364173312,"P"],
""" base58 encoding / decoding functions """
import unittest
alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
base_count = len(alphabet)
def encode(num):
""" Returns num in a base58-encoded string """
encode = ''
if (num < 0):
return ''
while (num >= base_count):
mod = num % base_count
encode = alphabet[mod] + encode
num = num / base_count
if (num):
encode = alphabet[num] + encode
return encode
def decode(s):
""" Decodes the base58-encoded string s into an integer """
decoded = 0
multi = 1
s = s[::-1]
for char in s:
decoded += multi * alphabet.index(char)
multi = multi * base_count
return decoded
class Base58Tests(unittest.TestCase):
def test_alphabet_length(self):
self.assertEqual(58, len(alphabet))
def test_encode_10002343_returns_Tgmc(self):
result = encode(10002343)
self.assertEqual('Tgmc', result)
def test_decode_Tgmc_returns_10002343(self):
decoded = decode('Tgmc')
self.assertEqual(10002343, decoded)
def test_encode_1000_returns_if(self):
result = encode(1000)
self.assertEqual('if', result)
def test_decode_if_returns_1000(self):
decoded = decode('if')
self.assertEqual(1000, decoded)
def test_encode_zero_returns_empty_string(self):
self.assertEqual('', encode(0))
def test_encode_negative_number_returns_empty_string(self):
self.assertEqual('', encode(-100))
if __name__ == '__main__':
#print encode(int("00B94BA6C51B3D8372D82FDE5DC78773D960B5A82FCDAC8181",16))
print hex(decode("Wh4bh"))
IyAzNWFjYTg2My1hNjc0LTM4MDMtOWI5OC0yMjg4NjQ2NDIwOTgiLDE4NDQ2NzQ0MDA1MTU5ODcxNzc2LCJUIl0sWyJhYzhmMjlmNS04ZTNlLTMyMzQtYTNiOC01ZGE3MTAzYTFiMWEiLDE4NDQ2NzQ0MDA1MTIyNTIzMTM2LCJUIl0sWyIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAiLDAsIkEiXSxbIjFjNjdlYTg5LTZjODAtM2FlOC1hY2I0LTA4ODk1NzY3ODI0OSIsMTg0NDY3NDQwMDUxNDM5NjUyNjQsIlQiXSxbImQwMjUwYjFkLWQ4ZTMtMzM1YS05MWE4LTRkZDQxMTQ3MTMwZSIsMTg0NDY3NDQwMDUxNTc0MjA0OTYsIlQiXSxbImNiYzI4MmUxLTZiMjAtMzRjYS04ZmM3LTg3ZGY0MWUxNmVlZiIsMTg0NDY3NDQwMDUxNTczODk2MTYsIlQiXSxbIjM5YzFiMTAyLTg3NDgtMzUzMi1iYjlmLTMyZTJjNjJmMzcwNiIsMTg0NDY3NDQwMDUxMzI4MTQyMDgsIlQiXSxbIjY5ZTc4YjRhLTY2NzMtM2M1OS05ZGQ1LTc5YTAxZmE3MDBhMyIsMTg0NDY3NDQwMDUxMzIxNDE2MTYsIlQiXSxbIjYzYmNjZTk5LTI5NTUtM2RiMC1hYTcxLWJiMzM2NTFjZTNjMCIsMTg0NDY3NDQwMDUxNDE1ODE2MTYsIlQiXSxbIjc2YTY2ZGU0LWZhMmYtMzQ3YS1hOGJhLTIzNGUwZWE2OTYwNCIsMTg0NDY3NDQwMDUxNDAyODg4ODAsIlQiXSxbImM3YjEyOGQ1LTg3ODYtM2E5Ny05OTQyLWI5ZTFlNTMyN2MxMCIsMTg0NDY3NDQwMDUxNTc5MTM5NjgsIlQiXSxbImJlYTk5NjRkLWMzMjUtM2RjMS04NmY3LTE0NjVkOTc2MWQzNyIsMTg0NDY3NDQwMDUxNDIyOTQ3ODQsIlQiXSxbIjM1Mzg1NjExLWZiMjEtMzRlMi1iYmYyLTMxNWQwMzQ5M2M0MyIsMTg0NDY3NDQwMDUxNTAzNDEzNzYsIlQiXSxbIjFjYTFiYWZmLTNhMzctMzc1OS1hZGFkLWU4ZDY0NDU4NmVkYSIsMTg0NDY3NDQwMDUxMzc1MjY0MDAsIlQiXSxbIjg5Yzk2MDZkLTUwZTMtMzc1ZC1hNjM2LTdkZTg4OTJhM2ExYSIsMTg0NDY3NDQwMDUxMzgxODMxMjAsIlQiXSxbImMzMGZmNjk0LTI4NDItMzg3Yi05MGY4LTc2NWE4YWRmOTg2ZCIsMTg0NDY3NDQwMDUxNDMwNjA2MDgsIlQiXSxbImE0MjE0NWI1LWYzMDMtMzk5Yi05MTI0LWZiZDVkOWFjMjIyOSIsNjQ0MjQ1MDk0NCwiUyJdLFsiNGNiN2NjYmUtMzkzOS0zNzdjLTljMzYtMDhlYzhkNTgyMTUxIiw0MzA1MTkwOTEyLCJQIl0sWyIyNjY0NGY3Zi1kMDQyLTM4YzUtOTI5ZC0wMjMyYzFhNDNlYWIiLDQzMDY3ODAxNjAsIlAiXSxbIjZkMjRjNWM0LTY2NmEtM2Q4NS05YzJjLWM3NDE1MDAyODM3MiIsNDMyNDk4Mjc4NCwiUCJdLFsiMjI4NWUwMjktNWJhNS0zYjZkLTgwNjQtMTllOTc0YjY5YzcxIiw0MzY3MDQwNTEyLCJQIl0sWyI3NzlhZjgwOC1lN2ZhLTM4YzAtODQ4Zi1hZWE3YjhmNTc5MjUiLDQzMzI1MTk0MjQsIlAiXSxbImRmNmEwYmI2LTdmN2UtM2Q2My1iYjFiLWM5Y2Q4MGYwYTI0ZCIsNDMzNDIyMzM2MCwiUCJdLFsiYzFiOGE2NGQtOGQ1My0zNmNmLWExYzAtZjg3MzUxYTViZTdmIiw0MzM0OTExNDg4LCJQIl0sWyJlNzQ2YjVmNS1mNzhkLTNhMjUtYmY1MS01YWRjYWFiODIzODIiLDQzNDQ3NzQ2NTYsIlAiXSxbIjFhYmFkNTI4LTY4NjgtMzY4Zi05NGQzLWU2NTIzYjhmYjc3YyIsNDM2NDE3MzMxMiwiUCJdLAoiIiIgYmFzZTU4IGVuY29kaW5nIC8gZGVjb2RpbmcgZnVuY3Rpb25zICIiIgppbXBvcnQgdW5pdHRlc3QKIAphbHBoYWJldCA9ICcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JwpiYXNlX2NvdW50ID0gbGVuKGFscGhhYmV0KQoJCQpkZWYgZW5jb2RlKG51bSk6CgkiIiIgUmV0dXJucyBudW0gaW4gYSBiYXNlNTgtZW5jb2RlZCBzdHJpbmcgIiIiCgllbmNvZGUgPSAnJwoJCglpZiAobnVtIDwgMCk6CgkJcmV0dXJuICcnCgkKCXdoaWxlIChudW0gPj0gYmFzZV9jb3VudCk6CQoJCW1vZCA9IG51bSAlIGJhc2VfY291bnQKCQllbmNvZGUgPSBhbHBoYWJldFttb2RdICsgZW5jb2RlCgkJbnVtID0gbnVtIC8gYmFzZV9jb3VudAogCglpZiAobnVtKToKCQllbmNvZGUgPSBhbHBoYWJldFtudW1dICsgZW5jb2RlCiAKCXJldHVybiBlbmNvZGUKIApkZWYgZGVjb2RlKHMpOgoJIiIiIERlY29kZXMgdGhlIGJhc2U1OC1lbmNvZGVkIHN0cmluZyBzIGludG8gYW4gaW50ZWdlciAiIiIKCWRlY29kZWQgPSAwCgltdWx0aSA9IDEKCXMgPSBzWzo6LTFdCglmb3IgY2hhciBpbiBzOgoJCWRlY29kZWQgKz0gbXVsdGkgKiBhbHBoYWJldC5pbmRleChjaGFyKQoJCW11bHRpID0gbXVsdGkgKiBiYXNlX2NvdW50CgkJCglyZXR1cm4gZGVjb2RlZAogCmNsYXNzIEJhc2U1OFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogIGRlZiB0ZXN0X2FscGhhYmV0X2xlbmd0aChzZWxmKToKICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTgsIGxlbihhbHBoYWJldCkpCiAKICBkZWYgdGVzdF9lbmNvZGVfMTAwMDIzNDNfcmV0dXJuc19UZ21jKHNlbGYpOgogICAgcmVzdWx0ID0gZW5jb2RlKDEwMDAyMzQzKQogICAgc2VsZi5hc3NlcnRFcXVhbCgnVGdtYycsIHJlc3VsdCkKIAogIGRlZiB0ZXN0X2RlY29kZV9UZ21jX3JldHVybnNfMTAwMDIzNDMoc2VsZik6CiAgICBkZWNvZGVkID0gZGVjb2RlKCdUZ21jJykKICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMDIzNDMsIGRlY29kZWQpCiAKICBkZWYgdGVzdF9lbmNvZGVfMTAwMF9yZXR1cm5zX2lmKHNlbGYpOgogICAgcmVzdWx0ID0gZW5jb2RlKDEwMDApCiAgICBzZWxmLmFzc2VydEVxdWFsKCdpZicsIHJlc3VsdCkKIAogIGRlZiB0ZXN0X2RlY29kZV9pZl9yZXR1cm5zXzEwMDAoc2VsZik6CiAgICBkZWNvZGVkID0gZGVjb2RlKCdpZicpCiAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDAsIGRlY29kZWQpCiAKICBkZWYgdGVzdF9lbmNvZGVfemVyb19yZXR1cm5zX2VtcHR5X3N0cmluZyhzZWxmKToKICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIGVuY29kZSgwKSkKIAogIGRlZiB0ZXN0X2VuY29kZV9uZWdhdGl2ZV9udW1iZXJfcmV0dXJuc19lbXB0eV9zdHJpbmcoc2VsZik6CiAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBlbmNvZGUoLTEwMCkpCiAKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAjcHJpbnQgZW5jb2RlKGludCgiMDBCOTRCQTZDNTFCM0Q4MzcyRDgyRkRFNURDNzg3NzNEOTYwQjVBODJGQ0RBQzgxODEiLDE2KSkKICBwcmludCBoZXgoZGVjb2RlKCJXaDRiaCIpKQ==