문제

나를 표현하려고 결과의 MD5 해쉬에서 가능한 짧은 문자열입니다.그것은 보인다는 폐기물을 단지 그것으로 진수 문자열을 보 G Z 를 통해 이동합니다.

하나의 아이디어가 있었다는 점점 MD5 해쉬의 내 입력 바이트 배열로를 건설 BigInt 습니다.그런 다음 전화 toString(36), 을 얻을 수를 기본으로-36 문자열에서(-?[0-9a-z]*, 수 될 수 있다는 긍정적 또는 부정적인).그것은 나를 위해 작동합니다.

문제입니다,나는 확실하지 않는 BigInt 건설할 수 있으로 모든 바이트 배열,내가 그것을 입증할 수 없으로 테스트(적어도에서는 적절한 방법으로!).나는,그래서 가정을 이해하기 때문에 그 BigInt 수 있습의 임의 크기입니다.수 이 방법을 사용할 때까지 내가 확실히 알 것이 작업에 대한 모든 가능한 출력이 있습니다.그래서,할 수 있는 사람을 말할 것인지 작업에 대한 모든 입력(또는 어떻게 변환하는 바이트 배열 될 수 있도록에 표시되는 기본 36).

설명:나의 구현,나는에 대해 묻는 행동을 통해 전체 도메인(예:00000000000000000000000000000000 을 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)

도움이 되었습니까?

해결책

건물에서 당신의 피드백 위에,다음과 같은 구현이 안정적으로 인코딩/디코딩하는 임의의 바이트 배열:

package blevins.example

object BigIntEncoder {
  val radix = 36

  implicit def byteArrayToString(ba: Array[Byte]): String = {
    new java.math.BigInteger(addByte(ba)).toString(radix)
  }

  implicit def stringToByteArray(s: String): Array[Byte] = {
    stripByte(new java.math.BigInteger(s, radix).toByteArray)
  }

  def addByte(ba: Array[Byte]): Array[Byte] = {
    val h = new Array[Byte](1)
    h(0) = 0x01
    h ++ ba
  }

  def stripByte(ba: Array[Byte]): Array[Byte] = {
    ba.slice(1,ba.size)
  }

}

참고 우리는 추가 0x01 바이트의 배열을 피하기 위해 어떤 효과 측면에서 두 개의 바이트 배열입니다.

편집:테스트 관여 이를 증명하기 위해 밖으로 여기서 설명: http://cleverlytitled.blogspot.com/2009/10/scalacheck.html

다른 팁

지 않을 Base64 로 인코딩되보다 짧은 Base36?당신이 많이 찾을 수 있습의 구현니다.

지만,실제로 질문에 대답:

  // Make a big randomly-filled byte array
  val random = scala.util.Random
  val arraySize = 8543
  val bytes: Array[Byte] = new Array[Byte](arraySize) // make some big array
  random.nextBytes(bytes) // fill it randomly

  // Make a BigInt out of it and the corresponding base36 string representation
  val bi: BigInt = new BigInt(new java.math.BigInteger(bytes))
  val strRep: String = bi.toString(36)

  // Make a new BigInt out of the string rep.  Does it match?
  val bi2: BigInt = new BigInt(new java.math.BigInteger(strRep, 36))
  if (bi == bi2) {
      println("yippee!!")
  }

  // Make a new byte array out of the BigInt.  Does it match the original array?
  val bytes2: Array[Byte] = bi2.toByteArray
  if (bytes deepEquals bytes2) {
      println("yippee again!!")
  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top