我目前正在编写一段使用 base 36 编码的 JavaScript。
我遇到了这个问题:
parseInt("welcomeback",36).toString(36)
Run Code Online (Sandbox Code Playgroud)
看来要回来了"welcomebacg"。
我在 Chrome 开发人员的控制台和 Node.js 中对此进行了测试,结果相同。
这个结果有什么合乎逻辑的解释吗?
我有一个由base36(0-9然后是az)组织的文件夹列表.现在我读取它们的当前实现是迭代一个数字,将其转换为base32,检查文件夹是否存在.如果它没有结束,它确实读取了数据.
这里的问题是文件夹的数字有差距.例如:0,1,2,4,5,6,8,a,b,c,g,k,p
以正确的顺序迭代它们的最佳方法是什么(考虑到可以有任意数量的文件夹)?
(注意:我不能简单地获取所有目录,因为它们按字母顺序排列.例如2A将放在z之前)
我想在我正在开发的Web应用程序中使用base36 ...但由于用户可以看到id作为URL,我想过滤掉亵渎.有人解决了这个吗?或者这甚至是一个真正的问题?
在我的数据库序列中跳过数字是否有意义?
我目前从int转换为base36字符串(70%〜程序时间).这段代码有没有明显的优化?
public static final String alphabet = "0123456789abcdefghijklmnopqrstuvwxyz";
public static StringBuilder b = new StringBuilder();
public static String sign = "";
public static String convertToBase36(int number)
{
if (number == 0)
{
return "0";
}
b.delete(0, b.length());
sign = "";
if (number < 0)
{
sign = "-";
number = -number;
}
int i = 0;
int counter = 10;
while (number != 0 && counter > 0)
{
counter--;
i = number % 36;
number = (number - i)/36; …Run Code Online (Sandbox Code Playgroud) 我想用PHP转换基数为36的数字.该函数base_convert无法正常工作,因为我想转换大数字:如果我将它从基数36再次转换为十进制,我不会得到我的初始数字.
我试过在多个网站上给出了一些功能,但我从来没有得到相同的结果.此外,这两个网站(在Javascript中)给出相同的结果:
例如1010701001118000000000000000必须转换为3IZS0ZE1RQ68W8SSW4.
以下是我尝试过的功能(哪些功能不起作用):
我正在尝试将一些代码转换为 C#(从 JavaScript),我需要通过 C# 将双数(0.04036483168558814)转换为“.toString(36)/Base36”。
JavaScript 代码在这里:
var num = 0.04036483168558814;
var n = num.toString(36);
Run Code Online (Sandbox Code Playgroud)
输出(n)如下:
0.1gb9f0lx08ij9wwfwkyk5d0a4i
Run Code Online (Sandbox Code Playgroud)
我需要 C# 的上述相同结果,那么如何在 C# 中获得相同的结果?
我应用了一些代码,但它们不起作用..我的代码如下(由 C# 编写):
1)
string OutputVal = Convert.ToString(Int64.Parse("0.04036483168558814"), 36);
Run Code Online (Sandbox Code Playgroud)
或者
string OutputVal = Convert.ToString(Int64.Parse("0.04036483168558814".Substring(2)), 36);
Run Code Online (Sandbox Code Playgroud)
2)
private const string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";
public static String Encode(long input)
{
if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative");
char[] clistarr = CharList.ToCharArray();
var result = new Stack<char>();
while (input != 0)
{
result.Push(clistarr[input % 36]);
input …Run Code Online (Sandbox Code Playgroud) 我最近一直在使用base-36,并且从未满足于将int转换为base-36字符串的通常答案.它看起来有点不平衡......
def to_base36(value):
if not isinstance(value, int):
raise TypeError("expected int, got %s: %r" % (value.__class__.__name__, value))
if value == 0:
return "0"
if value < 0:
sign = "-"
value = -value
else:
sign = ""
result = []
while value:
value, mod = divmod(value, 36)
result.append("0123456789abcdefghijklmnopqrstuvwxyz"[mod])
return sign + "".join(reversed(result))
Run Code Online (Sandbox Code Playgroud)
...与转换回来相比......
def from_base36(value):
return int(value, 36)
Run Code Online (Sandbox Code Playgroud)
Python真的没有包含这个特定的电池吗?
对于类似于URL缩短器服务的应用程序,我想创建不可猜测的id,你们都熟悉我认为.这是一个这样的id的例子:
在将这些作为主键插入数据库表时,产生这些的最佳(或没有)冲突的风险是什么?
编辑:
Piskvor当然是一个很好的观点.我应该提到在达到36 ^ 6限制之前我意味着最小的碰撞风险.
编辑2
呃,废弃了,他的观点远远超过了当然.嗯.然后,或许(就像我已经在其他地方读过的那样)预先创建一个带有id的表格?当我受到36 ^ 6和非连续约束时,这可能是最有效的技术吗?
长话短说 \xc2\xa0 选择行时如何测试字符串是否为十六进制?
\n\n如果我有一个包含 GUID 的表,其中一些是 Base36,而不是十六进制:
\n\n ID | GUID\n ===|=================================\n 1 | CAFEBABECAFED00DB16B00B515BADA55\n 2 | 0123456789ABCDEFGHIJKLMNOPQRSTUV\n 3 | DEADBEAF4D15EA5EDEFEC8EDFEE1DEAD\nRun Code Online (Sandbox Code Playgroud)\n\n我想要获取 GUID 不完全是十六进制的所有行。
\n\n对于单例,我可以尝试CONVERT(VARBINARY(32),[GUID],2)看看它是否失败,但我可以在查询中\xe2\x80\x99t 进行验证。如果我可以查询WHERE isNaN(parseInt(GUID,16)),它将是故障安全的(同时必须应用于所有行)。
当然,我可以全文搜索 F ( WHERE [GUID] LIKE \'%g%\' OR [GUID] LIKE \'%h%\' OR \xe2\x80\xa6) 之后的字母,但这种最后的方法让我提出了这个问题:
如何仅查询(非)十六进制字段?
\n[编辑]我不接受任何涉及BigInteger或其他类似低效方法的答案.请在回答之前先阅读问题!
令人讨厌的是,Java不支持无符号数字类型.您可以使用下一个更大的类型将byte,short或int转换为unsigned,例如:
short s = -10;
int unsigned_short = s & 0xFFFF;
Run Code Online (Sandbox Code Playgroud)
但是你不能长久地做到这一点,因为没有更大的类型.
那么,如何将一个签名的long转换为"unsigned"base-X,在我的情况下是base-36,然后返回?Long类具有这些方法,但将longs视为已签名,仅仅因为它们是.
我可以使用一些操作和BigInteger来做到这一点,但BigInteger 非常慢,并通过临时BigInteger创建创建垃圾.我会做很多转换(我想).我需要一个与Long.toString(long i,int radix)的默认实现一样高效的算法.
试图调整Long.toString()的代码我来:
final int RADIX = 36;
final char[] DIGITS = { '0', ... , 'Z' };
long value = 100;
if (value == 0) {
return "0";
} else {
char[] buf = new char[13];
int charPos = 12;
long i = value;
while (i != 0) {
buf[charPos--] = DIGITS[Math.abs((int) (i % RADIX))];
i /= RADIX;
}
return …Run Code Online (Sandbox Code Playgroud) 在 C 中,将 64 个字符的十六进制数(作为字符串)转换为基数 36 字符串的有效方法是什么?
我的意思是,这是否像组合一些 GLIB2 函数(在 Linux 上)或标准库函数一样简单?或者,我必须全部定制吗?
将数字转换为不同的基数后:
String thirteenAsBase36 = Long.toString(13, 36);
Run Code Online (Sandbox Code Playgroud)
如何将String转换回正常的10号基数?
Long thirteenAsBase10 = ?
Run Code Online (Sandbox Code Playgroud) base36 ×12
java ×3
c# ×2
hex ×2
javascript ×2
php ×2
base ×1
biginteger ×1
c ×1
encoding ×1
math ×1
mysql ×1
node.js ×1
numbers ×1
optimization ×1
primary-key ×1
profanity ×1
python ×1
sql-server ×1
string ×1
t-sql ×1
unique ×1
unsigned ×1