102 lines
4.3 KiB
C#
102 lines
4.3 KiB
C#
using System.Text;
|
|
|
|
namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
|
|
|
internal abstract class Id
|
|
{
|
|
|
|
internal static bool NameWithoutExtensionIsIdFormat(Properties.IPropertyConfiguration propertyConfiguration, string fileNameWithoutExtension)
|
|
{
|
|
bool result;
|
|
if (fileNameWithoutExtension.Length < 5 || fileNameWithoutExtension.Length > propertyConfiguration.IntMinValueLength)
|
|
result = false;
|
|
else
|
|
{
|
|
bool skipOneAllAreNumbers = fileNameWithoutExtension[1..].All(char.IsNumber);
|
|
result = (skipOneAllAreNumbers && fileNameWithoutExtension[0] == '-') || (skipOneAllAreNumbers && char.IsNumber(fileNameWithoutExtension[0]));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId)
|
|
{
|
|
int result;
|
|
StringBuilder results = new();
|
|
if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2))
|
|
throw new NotSupportedException();
|
|
for (int i = intelligentId.Length - (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2); i > -1; i--)
|
|
_ = results.Append(intelligentId[i]);
|
|
_ = results.Append(intelligentId[^3]).Append(intelligentId[^2]);
|
|
result = int.Parse(results.ToString());
|
|
if (intelligentId[^1] is '1' or '2')
|
|
result *= -1;
|
|
else if (intelligentId[^1] is not '9' and not '8')
|
|
throw new NotSupportedException();
|
|
return result;
|
|
}
|
|
|
|
internal static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal)
|
|
{
|
|
string result;
|
|
StringBuilder stringBuilder = new();
|
|
if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2))
|
|
throw new NotSupportedException();
|
|
if (hasDateTimeOriginal is null)
|
|
{ }
|
|
int key;
|
|
string value;
|
|
List<char> resultAllInOneSubdirectoryChars = [];
|
|
if (id > -1)
|
|
{
|
|
key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 8 : 9;
|
|
value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0');
|
|
}
|
|
else
|
|
{
|
|
key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 2 : 1;
|
|
value = id.ToString()[1..].PadLeft(propertyConfiguration.IntMinValueLength, '0');
|
|
}
|
|
for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength - 1; i > -1; i--)
|
|
_ = stringBuilder.Append(value[i]);
|
|
for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength; i < value.Length; i++)
|
|
resultAllInOneSubdirectoryChars.Add(value[i]);
|
|
result = $"{stringBuilder}{string.Join(string.Empty, resultAllInOneSubdirectoryChars)}{key}";
|
|
return result;
|
|
}
|
|
|
|
internal static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal, int? index)
|
|
{
|
|
string result;
|
|
if (propertyConfiguration.Offset < 0)
|
|
result = Guid.NewGuid().ToString();
|
|
else
|
|
{
|
|
string intelligentId = GetIntelligentId(propertyConfiguration, id, hasIgnoreKeyword, hasDateTimeOriginal);
|
|
int check = GetId(propertyConfiguration, intelligentId);
|
|
if (check != id)
|
|
throw new NotSupportedException();
|
|
result = index is null || propertyConfiguration.Offset == IId.DeterministicHashCode ? intelligentId : $"{propertyConfiguration.Offset + index}{intelligentId}";
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal static int GetDeterministicHashCode(byte[] value)
|
|
{
|
|
int result;
|
|
unchecked
|
|
{
|
|
int hash1 = (5381 << 16) + 5381;
|
|
int hash2 = hash1;
|
|
for (int i = 0; i < value.Length; i += 2)
|
|
{
|
|
hash1 = ((hash1 << 5) + hash1) ^ value[i];
|
|
if (i == value.Length - 1)
|
|
break;
|
|
hash2 = ((hash2 << 5) + hash2) ^ value[i + 1];
|
|
}
|
|
result = hash1 + (hash2 * 1566083941);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
} |