2017-12-15 2 views
2

이 질문은 이전 질문에 대한 후속 조치입니다. How can I convert a UUID to a string using a custom character set in Ruby? 그러나이 질문은 별도의 특정 질문으로 공식화하려고 시도합니다. 내가 제대로 IFC 사양 (http://www.buildingsmart-tech.org/ifc/IFC2x3/TC1/html/ifcutilityresource/lexical/ifcgloballyuniqueid.htm)을 얻는 경우에루비 base64는 끝에있는 패딩을 막기 위해 2 비트 문자로 시작하여 128 비트 숫자를 인 코드합니다.

SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" 

, 나는이 대신 마지막에 패딩을 얻는 인코딩 Base64로 원하는 :

나는 16 진수 값으로 루비 128 비트 UUID를해야합니까 출력을 6 비트 (64 개 옵션 필요) 대신 2 비트 문자 (4 개 옵션)로 시작하겠습니다.

이 방법으로 나는 22 문자 (2 비트 중 1 비트 및 총 128 비트의 6 비트 중 21 비트)의 문자열로 끝날 수 있다고 생각합니다.

이런 식으로 Ruby base64를 조정할 수 있습니까?

답변

2

짧은 대답 : 아니오. 엄밀히 말하자면, 표준 Base64가 아니기 때문에 루비의 표준 라이브러리는 그것을 다루지 않을 것입니다.

Ruby의 Base64 lib는 입력 데이터를 바이트로 취하므로 입력 데이터를 8로 나눌 수 있어야합니다.하지만 UUID 앞에 4 비트가 필요하므로 4 + 128 = 132가되므로 가장 가까운 다음 8의 배수는 136 즉 17 바이트입니다. 당신은 마지막에 추가 임의성을 취소 할 수 있습니다

x = SecureRandom.gen_random 17 # get a little extra randomness 
x[0] = (x[0].ord & 0x0f).chr  # 0 out the first four bits 
Base64.strict_encode64(x)[0...22] # discard extra randomness 

이 방법의 하나의 단점은 128 비트 UUID가 이상하게 그 자체로 볼 x 하드 내부에 정렬되어 있다는 것입니다. 128 비트를 얻으려면 몇 가지 팩/언팩으로 할 수 있습니다 :

+0

올바른 결과를 얻으려면 6 비트 세트가 필요하다고 생각합니다. 따라서 base64 만 바이트를 입력으로 사용한다면, 아마도 내 질문 자체가 올바르지 않습니다. (64 비트 옵션에 6 비트 필요)? 그런 다음 "아니오"는 실제로 정답입니다. 나는이 비트를 원하는 방식으로 매핑하는 또 다른 방법을 찾아야합니다. 제공된 링크에서 "C"예제 코드 조각도 있지만 읽는 데 어려움이 있습니다. –

+0

@JanBrouwer 당신의 추론은 실제로 정확합니다. 문제는 한편으로는 "베이스 64"라는 것입니다. 이것은 단순히 여러분이 설명한 것과 똑같이 작동하는 숫자 표현이며, 표준화 된 바이트 기반 인코딩 체계 인 "base 64 _encoding_"가 있습니다. 128 자리의 2 진수를 22 개의 64 진수로 변환하는 것은 완벽합니다. 하지만 그것은 _standard_가 아니기 때문에 루비는 stdlib에서 그것을 처리하지 않습니다. – Max

관련 문제