비트 코 인의 Base 58 인 코딩

2670 단어
base 58 는 base 64 와 마찬가지 로 바 이 너 리 시각 문자열 의 알고리즘 으로 주로 큰 정수 치 를 바 꾸 는 데 사용 된다.변 환 된 문자열 은 0 (0), O (대문자 O), I (대문자 i) and l (소문 자 L) 과 선택 에 영향 을 주 는 몇 개의 문 자 를 제거 합 니 다. 예 를 들 어 /, +.그 결과 문자 집합 은 58 글자 (숫자 9 개, 대문자 24 개, 소문 자 25 개 포함) 였 다.서로 다른 응용 실현 에서 base 58 가 마지막 으로 조회 한 자모표 가 다 를 수 있 기 때문에 구체 적 인 기준 이 없다.다음은 몇 가지 응용 프로그램의 알파벳 입 니 다.
비트 코 인 주소:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Monero 주소
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Ripple 주소
rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

Flickr 의 짧 은 URL
123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

Base 58 인 코딩 및 디 코딩
Base 58 의 입력 은 [0, 256) 값 의 흐름 입 니 다. 출력 결 과 는 [0, 58) 값 의 흐름 입 니 다. 그리고 모든 값 을 알파벳 을 찾 아 가시 적 인 문자열 을 얻 습 니 다. 변환 과정 은 실제 256 진법 의 값 을 58 진법 으로 변환 합 니 다.
진 변환 과정 은 다음 과 같 습 니 다 (아래 위조 코드 는 256 진 을 58 진 으로 변환 하 는 과정 을 설명 합 니 다. base 58 인 코딩 은 58 진 흐름 검사 표를 대응 하 는 문자 흐름 으로 변환 해 야 합 니 다).
#   input 256       output 58   
for carry in input: 
    for (outputPos, outputNum) in output.reverse(): 
        carry += outputNum * 256         
        output[outputPos] = carry % 58     
        carry /= 58
    # output      , carry    ,      output     
    while carry != 0 :
        output.insertFront(carry%58)
        carry /= 58

실현 할 때 시작 하 는 0 은 특수 처리 가 필요 하 다. 0 전환 후에 도 0 이기 때문에 입력 흐름 시작 하 는 0 을 결과 앞 에 직접 채 울 수 있다.
역 변환 과정 (입력 문자열 을 58 진 흐름 으로 변환 한 다음 58 진 흐름 을 256 진 흐름 으로 변환 합 니 다. 아래 의사 코드 는 58 진 을 256 진 으로 변환 합 니 다):
#   input 58       output 256   
for carry in input: 
    for (outputPos, outputNum) in output.reverse(): 
        carry += outputNum * 58        
        output[outputPos] = carry % 256      
        carry /= 256
    # output      , carry    ,      output     
    while carry != 0 :
        output.insertFront(carry%256)
        carry /= 256

마찬가지 로 실현 할 때 시작 하 는 0 은 특수 처리 가 필요 하 다. 0 전환 후에 도 0 이기 때문에 입력 흐름 시작 하 는 0 을 결과 앞 에 직접 채 울 수 있다.
Base58Check
비트 코 인 이 개선 판 Base 58 알고리즘 을 추가 한 이 유 는 Base 58 에서 내 보 낸 문자열 이 검증 메커니즘 이 없 는 것 을 해결 하기 위해 서 입 니 다. 그러면 전파 과정 에서 몇 글자 가 빠 지면 감지 되 지 않 습 니 다. 그래서 개선 판 알고리즘 Base 58 Check 을 사 용 했 습 니 다.
구현: encode 전에 입력 스 트림 끝 에 입력 내용 의 hash 값 (4 바이트) 을 추가 한 다음 입력 스 트림 을 Base58Encode 합 니 다.
decode 에서: 먼저 Base58Decode 를 한 다음 에 두 부분 (내용 과 검사 값) 으로 뜯 어서 내용 계산 에 대한 검사 값 과 검사 값 필드 가 일치 하 는 지 판단 합 니 다.
Go 의 base 58 라 이브 러 리:https://github.com/shengdoushi/base58
비트 코 인 Base 58 관련 소스 주소:https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp

좋은 웹페이지 즐겨찾기