mirror of
https://github.com/bitwarden/server.git
synced 2025-07-02 16:42:50 -05:00
Allow for binning of comb IDs by date and value
This commit is contained in:
@ -76,6 +76,39 @@ public static class CoreHelpers
|
||||
return new Guid(guidArray);
|
||||
}
|
||||
|
||||
internal static DateTime DateFromComb(Guid combGuid)
|
||||
{
|
||||
var guidArray = combGuid.ToByteArray();
|
||||
var daysArray = new byte[4];
|
||||
var msecsArray = new byte[4];
|
||||
|
||||
Array.Copy(guidArray, guidArray.Length - 6, daysArray, 2, 2);
|
||||
Array.Copy(guidArray, guidArray.Length - 4, msecsArray, 0, 4);
|
||||
|
||||
Array.Reverse(daysArray);
|
||||
Array.Reverse(msecsArray);
|
||||
|
||||
var days = BitConverter.ToInt32(daysArray, 0);
|
||||
var msecs = BitConverter.ToInt32(msecsArray, 0);
|
||||
|
||||
var time = new TimeSpan(days, 0, 0, 0, (int)(msecs * 3.333333));
|
||||
return new DateTime(_baseDateTicks + time.Ticks, DateTimeKind.Utc);
|
||||
}
|
||||
|
||||
internal static double BinForComb(Guid combGuid, int binCount)
|
||||
{
|
||||
// From System.Web.Util.HashCodeCombiner
|
||||
uint CombineHashCodes(uint h1, byte h2)
|
||||
{
|
||||
return (uint)(((h1 << 5) + h1) ^ h2);
|
||||
}
|
||||
var guidArray = combGuid.ToByteArray();
|
||||
var randomArray = new byte[10];
|
||||
Array.Copy(guidArray, 0, randomArray, 0, 10);
|
||||
var hash = randomArray.Aggregate((uint)randomArray.Length, CombineHashCodes);
|
||||
return hash % binCount;
|
||||
}
|
||||
|
||||
public static string CleanCertificateThumbprint(string thumbprint)
|
||||
{
|
||||
// Clean possible garbage characters from thumbprint copy/paste
|
||||
|
@ -71,6 +71,31 @@ public class CoreHelpersTests
|
||||
Assert.Equal(expectedComb, comb);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(GenerateCombCases))]
|
||||
public void DateFromComb_WithComb_Success(Guid inputGuid, DateTime inputTime)
|
||||
{
|
||||
var comb = CoreHelpers.GenerateComb(inputGuid, inputTime);
|
||||
var inverseComb = CoreHelpers.DateFromComb(comb);
|
||||
|
||||
Assert.Equal(inputTime, inverseComb, TimeSpan.FromMilliseconds(4));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("00000000-0000-0000-0000-000000000000", 1, 0)]
|
||||
[InlineData("00000000-0000-0000-0000-000000000001", 1, 0)]
|
||||
[InlineData("00000000-0000-0000-0000-000000000000", 500, 430)]
|
||||
[InlineData("00000000-0000-0000-0000-000000000001", 500, 430)]
|
||||
[InlineData("10000000-0000-0000-0000-000000000001", 500, 454)]
|
||||
[InlineData("00000000-0000-0100-0000-000000000001", 500, 19)]
|
||||
public void BinForComb_Success(string guidString, int nbins, int expectedBin)
|
||||
{
|
||||
var guid = Guid.Parse(guidString);
|
||||
var bin = CoreHelpers.BinForComb(guid, nbins);
|
||||
|
||||
Assert.Equal(expectedBin, bin);
|
||||
}
|
||||
|
||||
/*
|
||||
[Fact]
|
||||
public void ToGuidIdArrayTVP_Success()
|
||||
|
Reference in New Issue
Block a user