javascript - 如何在JavaScript中将整数转换为指定字符集的字符串

标签 javascript string hash

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

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

更新:我改进了这个问题的措辞。它不是 Fastest way to convert a number to radix 64 in JavaScript? 的重复项,因为字符集是任意的。该问题中的一些答案可能适用于这个问题,但我认为这是一个根本不同的问题。

最佳答案

这是“Base64”转换问题的变体,可以通过“base n”库来回答。然而,这些库对于这个问题可能是“过度杀伤”,所以下面是基于 simple & elegant solution by @Reb.Cabin 的修改代码。还要感谢此代码的编辑 @callum、@Philip Kaplan、@Oka。

在此响应中,元音和常用于创建脏话的各种“问题字母”被删除,因此随机整数哈希不会创建令人反感的短网址。

// 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
//   v       v       v       v       v       v       v       v      v
    "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 + '.');

关于javascript - 如何在JavaScript中将整数转换为指定字符集的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35637361/

相关文章:

c# - 如何拆分分隔符保留在结果末尾的字符串?

ruby - `each_with_object(Hash.new([]))` 是如何工作的?

perl - 从参数中取消引用哈希

javascript - 未捕获的语法错误 : Unexpected token & due to &quot error

javascript - 使用 CSS 和 Velocity JS 淡化内联 block

javascript - 使用 jquery、javascript 防止回发

android - 如何获取所有单列值然后将其传递给 String[]?

javascript - 想要一个 javascript 函数每分钟运行一次,但最多运行 3 次

Python - 在 "\\"之后拆分时丢失数据

mysql - 在多列中搜索的最佳方式