//
// DefaultAnonymizer.cs
//
// Copyright (c) František Boháček. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
namespace Anonymizer;
/// <inheritdoc />
public class DefaultAnonymizer : IAnonymizer
{
private readonly Random _random;
private readonly HashSet<long> _generated;
private readonly Dictionary<long, long> _ids;
private readonly Dictionary<string, string> _names;
/// <summary>
/// Initializes a new instance of the <see cref="DefaultAnonymizer"/> class.
/// </summary>
public DefaultAnonymizer()
{
_random = new Random();
_generated = new HashSet<long>();
_ids = new Dictionary<long, long>();
_names = new Dictionary<string, string>();
}
/// <inheritdoc />
public string AnonymizeName(string name)
{
if (!_names.ContainsKey(name))
{
var generatedName = string.Empty;
for (var i = 0; i < 10; i++)
{
generatedName += (char)_random.Next('A', 'Z');
}
_names[name] = generatedName;
}
return _names[name];
}
/// <inheritdoc />
public long AnonymizeId(long id)
{
if (!_ids.ContainsKey(id))
{
var generated = _random.Next();
if (_generated.Contains(generated))
{
return AnonymizeId(id);
}
_ids[id] = generated;
_generated.Add(generated);
}
return _ids[id];
}
/// <inheritdoc />
public int AnonymizeId(int id)
{
if (!_ids.ContainsKey(id))
{
var generated = _random.Next() & 0xFFFFFFFF;
if (_generated.Contains(generated))
{
return AnonymizeId(id);
}
_ids[id] = generated;
_generated.Add(generated);
}
return (int)_ids[id];
}
/// <inheritdoc />
public short AnonymizeId(short id)
{
if (!_ids.ContainsKey(id))
{
var generated = _random.Next() & 0xFFFF;
if (_generated.Contains(generated))
{
return AnonymizeId(id);
}
_ids[id] = generated;
_generated.Add(generated);
}
return (short)_ids[id];
}
/// <inheritdoc />
public (long Id, string Name) Anonymize(long id, string name)
=> (AnonymizeId(id), AnonymizeName(name));
}