code: public HashCalculationResult calculateSuperHash(byte[] bytes) throws IOException {
          HashCalculationResult result = null;
  
          // Remove white spaces
          byte[] bytesWithoutSpaces = stripWhiteSpaces(bytes);
  
          long fileSize = bytesWithoutSpaces.length;
          if (fileSize < FILE_MIN_SIZE_THRESHOLD) {
              // Ignore files smaller 1/2 kb
              logger.debug("Ignoring file with size " + FileUtils.byteCountToDisplaySize(fileSize) + ": minimum file size is 512B");
          } else if (fileSize <= FILE_PARTIAL_HASH_MIN_SIZE) {
              // Don't calculate msb and lsb hashes for files smaller than 2kb
              String fullFileHash = calculateByteArrayHash(bytesWithoutSpaces, HashAlgorithm.SHA1);
              result = new HashCalculationResult(fullFileHash);
          } else if (fileSize <= FILE_SMALL_SIZE) {
              // Handle 2kb->3kb files
              result = hashBuckets(bytesWithoutSpaces, FILE_SMALL_BUCKET_SIZE);
          } else {
              int baseLowNumber = 1;
              int digits = (int) Math.log10(fileSize);
              int i = 0;
              while (i < digits) {
                  baseLowNumber = baseLowNumber * 10;
                  i++;
              }
              double highNumber = Math.ceil((fileSize + 1) / (float) baseLowNumber) * baseLowNumber;
              double lowNumber = highNumber - baseLowNumber;
              double bucketSize = (highNumber + lowNumber) / 4;
              result = hashBuckets(bytesWithoutSpaces, bucketSize);
          }
          return result;
      }
docs: Calculates 3 hashes for the given bytes:
  
  1. Hash of the file without new lines and whitespaces
  2. Hash of the most significant bits of the file without new lines and whitespaces
  3. Hash of the least significant bits of the file without new lines and whitespaces
  
  @param bytes to calculate
  @return HashCalculationResult with all three hashes
  @throws IOException exception2