laget.Fingerprint
1.2.30
Prefix Reserved
dotnet add package laget.Fingerprint --version 1.2.30
NuGet\Install-Package laget.Fingerprint -Version 1.2.30
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="laget.Fingerprint" Version="1.2.30" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add laget.Fingerprint --version 1.2.30
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: laget.Fingerprint, 1.2.30"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install laget.Fingerprint as a Cake Addin
#addin nuget:?package=laget.Fingerprint&version=1.2.30
// Install laget.Fingerprint as a Cake Tool
#tool nuget:?package=laget.Fingerprint&version=1.2.30
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
laget.Fingerprint
Calculates a fingerprint (hash) for an object that can be stored in Memory or a persistent data store.
Configuration
This example is shown using Autofac since this is the go-to IoC for us.
public class FingerprintModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<Fingerprint>().As<IFingerprint>();
builder.Register<IFingerprintManager<Fingerprint, User>>(c =>
new FingerprintManager<Fingerprint, User>(new DictionaryStore<Fingerprint>())
).SingleInstance();
}
}
Usage
Model
Since we do not supply a default implementation of the fingerprint model you need to implement one yourself!
public class Fingerprint : IFingerprint
{
public string Hash { get; set; }
public object Data { get; set; }
public object Metadata { get; set; }
public DateTime CreatedAt { get; set; } = DateTime.Now;
public override bool Equals(object obj)
{
if (!(obj is IFingerprint))
{
return false;
}
if (ReferenceEquals(obj, this))
{
return true;
}
var fingerprint = (IFingerprint)obj;
if (Hash == null)
{
return fingerprint.Hash == null;
}
return Hash.Equals(fingerprint.Hash, StringComparison.OrdinalIgnoreCase);
}
public override int GetHashCode()
{
return Hash.GetHashCode();
}
public static bool operator ==(Fingerprint lhs, Fingerprint rhs)
{
if (ReferenceEquals(lhs, null))
{
return ReferenceEquals(rhs, null);
}
return lhs.Equals(rhs);
}
public static bool operator !=(Fingerprint lhs, Fingerprint rhs)
{
return !(lhs == rhs);
}
}
Object
This is the object which you like to fingerprint!
public class User : IFingerprintable
{
private readonly Func<User, byte[]> _fingerprintBuilder;
public User()
{
_fingerprintBuilder = FingerprintBuilder<User>
.Create(SHA512.Create().ComputeHash)
.For(x => x.Id)
.For(x => x.Firstname)
.For(x => x.Lastname)
.For(x => x.Email)
.Build();
}
public int Id { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public string Email { get; set; }
public DateTime LastActive { get; set; } = DateTime.Now;
public IFingerprint Fingerprint => new Fingerprint
{
Hash = _fingerprintBuilder(this).ToUpperHexString(),
Data = new
{
Id,
Firstname,
Lastname,
Email
},
Metadata = new
{
LastActive
}
};
}
Benchmarks
BenchmarkDotNet v0.13.10, Windows 11 (10.0.22631.2715/23H2/2023Update/SunValley3)
AMD Ryzen Threadripper 3960X, 1 CPU, 48 logical and 24 physical cores
.NET SDK 8.0.100
[Host] : .NET 6.0.25 (6.0.2523.51912), X64 RyuJIT AVX2
Job-THOOBN : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2
Runtime=.NET 8.0 IterationCount=50 LaunchCount=2
RunStrategy=Throughput WarmupCount=10
Method | Mean | Error | StdDev | Median | Min | Max |
---|---|---|---|---|---|---|
MD5_Hex | 886.5 ns | 2.87 ns | 8.47 ns | 864.0 ns | 909.2 ns | 886.9 ns |
SHA1_Hex | 985.2 ns | 3.80 ns | 11.21 ns | 963.1 ns | 1,012.8 ns | 986.1 ns |
SHA256_Hex | 1.167 us | 0.0053 us | 0.0157 us | 1.135 us | 1.206 us | 1.168 us |
SHA512_Hex | 2.066 us | 0.0153 us | 0.0452 us | 2.006 us | 2.172 us | 2.054 us |
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net6.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on laget.Fingerprint:
Package | Downloads |
---|---|
laget.Fingerprint.Stores.Mongo
MongoDB store implementation for laget.Fingerprint... |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.2.30 | 238 | 1/20/2024 |
1.2.29 | 243 | 11/23/2023 |
1.2.25 | 143 | 7/3/2023 |
1.2.23 | 214 | 3/10/2023 |
1.2.20 | 255 | 2/26/2023 |
1.2.5 | 2,680 | 8/16/2021 |
1.2.4 | 403 | 8/9/2021 |
1.2.3 | 425 | 6/7/2021 |
1.2.2 | 460 | 5/21/2021 |
1.1.20 | 544 | 4/6/2021 |
1.1.19 | 487 | 3/5/2021 |
1.1.18 | 457 | 2/15/2021 |
1.1.17 | 299 | 2/15/2021 |
1.1.16 | 315 | 2/15/2021 |
1.1.14 | 779 | 2/14/2021 |
1.1.13 | 306 | 2/14/2021 |
1.1.12 | 306 | 2/14/2021 |
1.1.11 | 329 | 2/14/2021 |
1.1.10 | 795 | 2/14/2021 |
1.1.9 | 319 | 2/1/2021 |
1.1.8 | 343 | 1/8/2021 |
1.1.7 | 338 | 12/23/2020 |
1.1.6 | 335 | 12/8/2020 |
1.1.5 | 314 | 12/8/2020 |