/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES   OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.ambari.metrics.core.timeline.uuid;

import com.google.common.hash.Hashing;
import org.apache.ambari.metrics.core.timeline.aggregators.TimelineClusterMetric;
import org.apache.commons.lang.StringUtils;

public class Murmur3HashUuidGenStrategy implements MetricUuidGenStrategy{

  @Override
  public byte[] computeUuid(TimelineClusterMetric timelineClusterMetric, int maxLength) {

    String metricString = timelineClusterMetric.getMetricName() + timelineClusterMetric.getAppId();
    if (StringUtils.isNotEmpty(timelineClusterMetric.getInstanceId())) {
      metricString += timelineClusterMetric.getInstanceId();
    }
    byte[] metricBytes = metricString.getBytes();
    return Hashing.murmur3_128().hashBytes(metricBytes).asBytes();
  }

  @Override
  public byte[] computeUuid(String value, int maxLength) {
    byte[] valueBytes = value.getBytes();
    return Hashing.murmur3_32().hashBytes(valueBytes).asBytes();
  }
}
