gpt4 book ai didi

c# - 如何从数字生成最短的数据库标识符名称?

转载 作者:行者123 更新时间:2023-11-30 17:41:33 26 4
gpt4 key购买 nike

因为我正在编写软件来生成可能包含大量参数的 SQL 并将 SQL 记录到磁盘上,所以我有一个不常见的要求(也许更多的是出于好奇):生成尽可能短的唯一参数名称。

参数名称遵循标识符命名规则,通常是:

  1. 第一个字符是字母
  2. 后续字符可以是字母数字或某些其他字符,例如下划线。
  3. 几乎任何东西都可以用引号(忽略 -- 引号标识符总共至少三个字符,例如 [_])

SQL 生成代码知道总共有多少个标识符,因此可以根据整数生成名称。

最佳答案

这最终比我预期的更困难,而且解决方案也不那么优雅。我对无效值进行了硬编码(从 0 开始),因为它们很少,而且我为推导它们所做的每一次尝试最终都变得复杂而缓慢。我将不胜感激有关如何使它更优雅的想法。我也会在 CodeReview 上发帖。

大多数数据库支持少于 2^16 个参数(实际使用一个荒谬的数字),但在处理大于 35027(同样荒谬)的数字时,100 万是一个很好的强制停止点。

public static String intToDatabaseIdentifier(int number)
{
if(number < 0 || number > 1000000)
throw new ArgumentOutOfRangeException("number");
if(number > 25 && number <= 25 + 10) // Skip 0-9 (modified base 36)
number += 10;
if(number > 971 && number <= 971 + 360) // Skip 0a-09 (modified base 36)
number += 360;
if(number > 35027 && number <= 35027 + 12960) // Skip 0aa-099 (modified base 36)
number += 12960;
var stack = new Stack<char>();
// Base 36 starting with letters rather than numbers
const string characters = "abcdefghijklmnopqrstuvwxyz0123456789";
while(number >= 0) {
stack.Push(characters[number % 36]);
number = number / 36 - 1;
}
return new String(stack.ToArray());
}

以0开头的结果:

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
aa ab ac ad ae af ag ah ai aj aa ab ac ad ae af ag ah ai aj ak al am an ao
ap aq ar as at au av aw ax ay az a0 a1...

关于c# - 如何从数字生成最短的数据库标识符名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com