【问题标题】:encode a big integer to base62将一个大整数编码为 base62
【发布时间】:2020-04-08 04:38:17
【问题描述】:

我需要创建唯一的推荐代码。为了使每个推荐代码独一无二,我正在尝试执行以下操作。

const stringVal = `${currentTimestamp}${someVal}${someKey}`

这里someVal 本身是BigInt mysql 数据类型,而someKey 将始终是两位数。

为了编码,我使用base62 包。

每当我通过someVal 超过 99 时,我就会开始得到意想不到的结果。

function generateReferralCode(someVal) {
   const currentTimestamp = Date.now()
   let someKey = getSomeKey(someVal)
   const val = `${currentTimestamp}${someVal}${someKey}`
   console.log(`number to string : ${val}`)
   console.log(`longed value from string : ${Long.fromString(val)}`)
   const encodedVal = await base62.encode(Long.fromString(val))
   return encodedVal
}
function parseReferralCode(referralCode) {
    const decodedVal = base62.decode(referralCode)
    console.log(`decoded number : ${decodedVal}`)
    //extract someValue
    let  somevalue = parseInt(decodedVal / 100) % ( Math.pow(10, (decodedVal % 100)))
    return someValue
}

async function test() {
    const encoded = await generateReferralCode(100)
    console.log(`encoded val: ${encoded}`)
    const decoded = await parseReferralCode(encoded)
    console.log(`decoded val: ${decoded}`)
}
test()

Output:

number to  string : '158632196111710003'
longed value from string : 158632196111710003
encoded val: 'bIxiLMdWrm'
decoded number : 158632196111710000 //this should be as encoded string or longed val
decoded val: 1586321961117100 //this should be 100

以上不适用于someValue > 99 的值。我知道这是因为 integer javascript 中的长度。

我也尝试过使用long,但它也不起作用。

我认为base62 包也不支持大整数。

有人可以帮助我如何base62 编码那种大数字吗?

【问题讨论】:

  • 看起来该库不应该用于大量数字。也许找到一个可以处理字符串的。

标签: javascript node.js


【解决方案1】:

FWIW,以下是将 BigInt 转换为所需基数的两个辅助函数,反之亦然...

var digits = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

function bigint2base( x, baseDigits ) {

  let base = BigInt( baseDigits.length );
  let result = '';
  
  while ( 0 < x ) {
    result = baseDigits.charAt( Number( x % base ) ) + result;
    x = x / base;
  }
    
  return result || '0';
  
}


function base2bigint( x, baseDigits ) {

  let base = BigInt( baseDigits.length ); 
  let result = 0n;
  
  for ( let i = 0; i < x.length; i++ ) {
    result = result * base + BigInt( baseDigits.indexOf( x.charAt( i ) ) );
  }
  
  return result;
}

console.log( `BigInt 158632196111710003n to base62 ( '${digits}' )...`);
base62val = bigint2base( 158632196111710003n, digits );
console.log( base62val );

console.log( `Converted back to BigInt is...` );
console.log( base2bigint( base62val, digits ).toString() );

console.log('');
console.log( `BigInt 31957108571341948394931814703184314387417471347093174n to base62 ( '${digits}' )...`);
base62val = bigint2base( 31957108571341948394931814703184314387417471347093174n, digits );
console.log( base62val );

console.log( `Converted back to BigInt is...` );
console.log( base2bigint( base62val, digits ).toString() );

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多