/* Fill in the fields of the given KeyHash based on the key field(s)
   * of the given instance sample.
   * Important: The fields of the instance ID cannot all be set to zero!
   */
  public void instance_to_keyhash(Object endpoint_data, KeyHash_t keyhash, Object instance) {
    DefaultEndpointData endpointData = (DefaultEndpointData) endpoint_data;
    CdrOutputStream md5Stream = endpointData.get_stream();
    CdrBuffer buffer = null;

    if (md5Stream == null) {
      throw new RETCODE_ERROR("Missing MD5 stream");
    }

    buffer = md5Stream.getBuffer();
    buffer.resetBufferToZero();

    md5Stream.resetAndSetDirtyBit(true);

    serialize_key(
        endpoint_data,
        instance,
        md5Stream,
        false,
        CdrEncapsulation.CDR_ENCAPSULATION_ID_CDR_BE,
        true,
        null);

    if (endpointData.get_serialized_key_max_size() > KeyHash_t.KEY_HASH_MAX_LENGTH) {
      md5Stream.computeMD5(keyhash.value);
    } else {
      System.arraycopy(buffer.getBuffer(), 0, keyhash.value, 0, buffer.currentPosition());
      System.arraycopy(
          KeyHash_t.ZERO_KEYHASH.value,
          buffer.currentPosition(),
          keyhash.value,
          buffer.currentPosition(),
          KeyHash_t.KEY_HASH_MAX_LENGTH - buffer.currentPosition());
    }

    keyhash.length = KeyHash_t.KEY_HASH_MAX_LENGTH;
  }