c# - 如何将数字与自定义 2char BaseX 相互转换? (又名 : How to do Azure Table property compression)

标签 c# math azure azure-storage azure-table-storage

与十六进制中从 0 到 F 的计数方式类似,我有一个数字和字母数组,我想从中“计数”......当我达到最大值时,我想从头开始“十”列。

我需要它来提高 Azure 表中的存储效率,并保持我的主键很小(这样我就可以在tinyURL 中使用它们)。首先考虑只允许这些字符作为 propertyName,如文档 here 所示。 。在下面的数组中,每个字符根据 Azure 的排序方式进行定位。

  public static string[] AzureChars = new string[]
   {
        "0","1","2","3","4","5","6","7","8","9","A",
        "B","C","D","E","F","G","H","I",
        "J","K","L","M","N","O","P","Q",
        "R","S","T","U","V","W","X","Y",
        "Z","a","b","c","d","e","f","g",
        "h","i","j","k","l","m","n","o",
        "p","q","r","s","t","u","v","w",
        "x","y","z"       
   };

我的目标是使用 2 个字符串/ASCII 字符从字符串“00”计数到小写“zz”。

使用 C# 实现这一概念的最佳方法是什么?
-- 数组是正确使用的对象吗?
-- 如何将给定字符(大写“Y”)与其在数组中的位置关联起来?

我只是在尝试这个想法。乍一看,这似乎是一个不错的选择,但我还没有看到有人考虑这样做。你觉得怎么样?

最佳答案

您的问题实际上是关于将数字转换为两位数的 62 基数。以下是将正数转换为任意基数的通用代码片段:

var n = 1234;
var baseNumber = 62;
var numberOfDigits = 2;
var digits = new Int32[numberOfDigits];
for (var i = 0; i < digits.Length; i += 1) {
  digits[i] = n%baseNumber;
  n /= baseNumber;
}

您必须将数字映射为字符,并且查找表或一个小函数适合执行此操作。

对于具有可变位数的附加功能的具体问题,我会编写以下代码:

var n = 123456; 
var digitCount = 3;
var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var number = String.Empty;
for (var i = 0; i < digitCount; ++i) {
  number = digits[n%digits.Length] + number;
  n /= digits.Length;
}

请注意,此代码会将 0 转换为 000,将 1 转换为 001 等,但我认为其实就是你想要的。

要转换回来,您可以使用以下代码:

var n = 0;
for (var i = 0; i < number.Length; ++i)
  n = n*digits.Length + digits.IndexOf(number[i]);

String.IndexOf() 不是进行转换的最有效方法,但在大多数情况下应该没问题。

请注意,如果您的原始数字大于可存储在 62 基数中的最大数字,则转换回来将产生不同的数字。对于 62 进制的 3 位数字,如果原始数字大于或等于 zzz = 62^3 - 1 = 238327,则为 true。

关于c# - 如何将数字与自定义 2char BaseX 相互转换? (又名 : How to do Azure Table property compression),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740865/

相关文章:

c# - 为所有对象创建一个委托(delegate),而不是为每个对象创建一个委托(delegate)

math - exp2应该比exp快吗?

javascript - 多个动态创建的输入字段值不能超过指定数量

c#-4.0 - tableclient.RetryPolicy 对比 transient 故障处理

azure - 使用服务主体身份验证从 azure 函数读取 AD 组

c# - 如何对 MVC UserViewControl 进行单元测试?

c# - 在 GZIP 文件上使用 BitmapFactory.DecodeStreamAsync 将 URL 流式传输到 Android.Graphics.Bitmap

c# - 基本类型的必需属性没有意义

java - 从文本文件读取乐透

跨多个云服务的 Azure 专用缓存