Skip to content
Snippets Groups Projects
Select Git revision
  • renovate/golang.org-x-net-0.x
  • renovate/golang.org-x-crypto-0.x
  • renovate/git.autistici.org-ai3-go-common-digest
  • renovate/github.com-miekg-dns-1.x
  • master default protected
  • renovate/github.com-prometheus-client_golang-1.x
  • v3
  • v2
8 results

fingerprinting.go

Blame
  • fingerprinting.go 2.51 KiB
    // Copyright 2013 The Prometheus Authors
    // Licensed 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 model
    
    import (
    	"fmt"
    	"strconv"
    )
    
    // Fingerprint provides a hash-capable representation of a Metric.
    // For our purposes, FNV-1A 64-bit is used.
    type Fingerprint uint64
    
    // FingerprintFromString transforms a string representation into a Fingerprint.
    func FingerprintFromString(s string) (Fingerprint, error) {
    	num, err := strconv.ParseUint(s, 16, 64)
    	return Fingerprint(num), err
    }
    
    // ParseFingerprint parses the input string into a fingerprint.
    func ParseFingerprint(s string) (Fingerprint, error) {
    	num, err := strconv.ParseUint(s, 16, 64)
    	if err != nil {
    		return 0, err
    	}
    	return Fingerprint(num), nil
    }
    
    func (f Fingerprint) String() string {
    	return fmt.Sprintf("%016x", uint64(f))
    }
    
    // Fingerprints represents a collection of Fingerprint subject to a given
    // natural sorting scheme. It implements sort.Interface.
    type Fingerprints []Fingerprint
    
    // Len implements sort.Interface.
    func (f Fingerprints) Len() int {
    	return len(f)
    }
    
    // Less implements sort.Interface.
    func (f Fingerprints) Less(i, j int) bool {
    	return f[i] < f[j]
    }
    
    // Swap implements sort.Interface.
    func (f Fingerprints) Swap(i, j int) {
    	f[i], f[j] = f[j], f[i]
    }
    
    // FingerprintSet is a set of Fingerprints.
    type FingerprintSet map[Fingerprint]struct{}
    
    // Equal returns true if both sets contain the same elements (and not more).
    func (s FingerprintSet) Equal(o FingerprintSet) bool {
    	if len(s) != len(o) {
    		return false
    	}
    
    	for k := range s {
    		if _, ok := o[k]; !ok {
    			return false
    		}
    	}
    
    	return true
    }
    
    // Intersection returns the elements contained in both sets.
    func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet {
    	myLength, otherLength := len(s), len(o)
    	if myLength == 0 || otherLength == 0 {
    		return FingerprintSet{}
    	}
    
    	subSet := s
    	superSet := o
    
    	if otherLength < myLength {
    		subSet = o
    		superSet = s
    	}
    
    	out := FingerprintSet{}
    
    	for k := range subSet {
    		if _, ok := superSet[k]; ok {
    			out[k] = struct{}{}
    		}
    	}
    
    	return out
    }