Suj*_*ari 2 javascript node.js
我需要创建独特的推荐代码。为了使每个推荐代码都独一无二,我正在尝试执行如下操作。
const stringVal = `${currentTimestamp}${someVal}${someKey}`
Run Code Online (Sandbox Code Playgroud)
这里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
Run Code Online (Sandbox Code Playgroud)
以上不适用于 的值someValue > 99。我知道这是因为integerJavaScript 的长度。
我也尝试过使用long,但它也不起作用。
我认为base62包也不支持大整数。
有人可以帮助我如何对base62这种大数字进行编码吗?
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() );Run Code Online (Sandbox Code Playgroud)
希望这可以帮助...
| 归档时间: |
|
| 查看次数: |
1555 次 |
| 最近记录: |