繁体   English   中英

如何在JavaScript中将整数更改为具有指定字符集的字符串

[英]How to change an integer into a string with specified character set in JavaScript

给定一个基于哈希函数输出的整数var i = 1234567890 ,我需要创建一个简短的,区分大小写的字母数字字符串。 这是为了使简短URL具有区分大小写的哈希参数,例如http://example.com/?hash=1M0nlPk

JavaScript的i.toString(36)将使用字符0-9和az。 这是解决方案的一部分。 但是,我需要对未知或可配置长度的字符集进行操作,例如012abcABC 如何将int转换为仅包含此字符集的字符串?

更新:我改进了这个问题的措辞。 它不是在JavaScript中将数字转换为基数最快方法的重复吗? 因为字符集是任意的。 该问题中的某些答案可能适用于该问题,但我认为这是一个根本不同的问题。

这是“ Base64”转换问题的一种变体,可以通过“ base n”库来回答。 但是,这些库对于这个问题可能是“过大的”,因此下面是基于@ Reb.Cabin简单而优雅的解决方案的修改后的代码。 在此代码上,还要感谢编辑者@ callum,@ Philip Kaplan和@Oka。

在此响应中,删除了通常用于创建诅咒词的元音和各种“问题字母”,因此随机整数哈希将不会创建令人讨厌的简短URL。

 // Based on Base64 code by @Reb.Cabin, edits by @callum, @philip Kaplan, @Oka available at https://stackoverflow.com/a/6573119/3232832 BaseN = { _Rixits : // 0 8 16 24 32 40 48 56 63 // vvvvvvvvv "0123456789BDGHJKLMNPQRTVWXYZbdghjklmnpqrtvwxyz-_", // original base64 // "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_", // You have the freedom, here, to choose the glyphs you want for // representing your base-64 numbers. // This cannot handle negative numbers and only works on the // integer part, discarding the fractional part. fromNumber : function(number) { if (isNaN(Number(number)) || number === null || number === Number.POSITIVE_INFINITY) throw "The input is not valid"; if (number < 0) throw "Can't represent negative numbers now"; var rixit; // like 'digit', only in some non-decimal radix var residual = Math.floor(number); var result = ''; var rixitLen = this._Rixits.length; while (true) { rixit = residual % rixitLen; result = this._Rixits.charAt(rixit) + result; residual = Math.floor(residual / rixitLen); if (residual === 0) break; } return result; }, toNumber : function(rixits) { var result = 0; for (var e = 0; e < rixits.length; e++) { result = (result * this._Rixits.length) + this._Rixits.indexOf(rixits[e]); } return result; } }; var i = 1234567890; var encoded = BaseN.fromNumber(1234567890); var decoded = BaseN.toNumber(encoded); document.writeln('Given character set "' + BaseN._Rixits + '", the number ' + i + ' is encoded to ' + encoded + ' then back again to ' + decoded + '.'); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM