1. 程式人生 > >將int,bigint整型數值可逆轉換字串

將int,bigint整型數值可逆轉換字串

將 Int 和 BigInt 型別數值轉換為字串的可逆方法,可用於縮短網址或記錄的ID轉換等。
如: 9223372036854775807 => aZl8N0y58M7

class Convert
{
    /**
     * 預設金鑰字串
     * @var string
     */
    const KEY = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    /**
     * 將 Int 型別十進位制數值轉換為指定進位制編碼
     * @param int|string $num 取值範圍 0 ~ 2147483647 之間
     * @return
string */
public static function encodeInt($num) { $str = ''; if ($num <= 0) $str = substr(self::KEY, 0, 1); while ($num > 0) { $val = intval($num / 62); $mod = $num % 62; $str = substr(self::KEY, $mod, 1) . $str; $num
= $val; } return $str; } /** * 將編碼字串轉換為 Int 類整型數值 * @param string $code * @return int */ public static function decodeInt($code){ $result = null; $len = strlen($code); for ($i = 1; $i <= $len; $i++) { $char = substr($code
, $i - 1, 1); $result += intval(strpos(self::KEY, $char)) * pow(62, $len - $i); } return $result; } /** * 支援15位長度的整型,超過則精度大幅降低 * @param int $num * @return string */ public static function encodeInt2($num) { $out = ''; for ($t = floor(log10($num)/log10(62)); $t >= 0; $t--) { $a = floor($num/bcpow(62, $t)); $out = $out . substr(self::KEY, $a, 1); $num = $num - $a * pow(62, $t); } return $out; } /** * 支援最大15位整型字串的解碼 * @param string $num * @return string */ public static function decodeInt2($num) { $out = 0; $len = strlen($num) - 1; for ($t = 0; $t <= $len; $t++) { $out = $out + strpos(self::KEY, substr( $num, $t, 1 )) * pow(62, $len - $t); } return $out; } /** * 將 BigInt 型別的數值轉換為指定進位制值 * @param int|string $num * @return string */ public static function encodeBigInt($num) { bcscale(0); $str = ''; if ($num <= 0) $str = substr(self::KEY, 0, 1); while ($num > 0) { $div = bcdiv($num, 62); $mod = bcmod($num, 62); $str = substr(self::KEY, $mod, 1) . $str; $num = $div; } return $str; } /** * 將編碼字串轉換為 BigInt 類整型數值 * @param string $code * @return string */ public static function decodeBigInt($code) { bcscale(0); $result = ''; $len = strlen($code); for ($i = 1; $i <= $len; $i++) { $char = substr($code, $i - 1, 1); $result = bcadd(bcmul(strpos(self::KEY, $char), bcpow(62, $len - $i)), $result); } return $result; } }

測試方法:
這裡寫圖片描述

結果:
這裡寫圖片描述

echo 'Begin ~~<br><hr><br>';
$begin = microtime(true);
$bm = memory_get_usage();

$j = 0;
$cv = new Convert();
//for ($i = 0; $i < 10000; $i++) {
    $raw = '9223372036854775807';//rand(200000, 214748) . rand(1000, 3648);
    $encode = $cv->encodeBigInt($raw);
    $decode = $cv->decodeBigInt($encode);
//    $encode = $is->encodeInt($raw);
//    $decode = number_format($is->decodeInt($encode), 0, '', '');
    if ($raw != $decode) {
        $j++;
//        echo '<script>alert("not same");</script>';
    }
//}
    echo '原文: '. $raw .' 長度: '. strlen($raw) .'<br>';
    echo '編碼: '. $encode .' 長度: '. strlen($encode) .'<br>';
    echo '解碼: '. $decode .'<br>';
echo '不一致:'. $j;
echo '<br>';

$em = memory_get_usage();

echo 'End !<br><hr><br>Use Time :';
echo microtime(true) - $begin;
echo '<br><hr><br>Use Mem:';
echo ceil(($em - $bm)/1024/1024) .'MB';

相關推薦

intbigint數值可逆轉換字串

將 Int 和 BigInt 型別數值轉換為字串的可逆方法,可用於縮短網址或記錄的ID轉換等。 如: 9223372036854775807 => aZl8N0y58M7 class Con

mysql 批量更新數據庫主鍵為intbigint字段為自增類

span pre and style cat pri odi rem script select table_name, concat(‘alter table `‘,table_name,‘` MODIFY ‘, column_name, ‘ ‘, da

編寫程式實現atoi()講一個字串轉化為一個數值。如:“65321”轉化後為65321

#include <stdio.h>int main(int argc, const char *argv[]){    char buf[1024];    int i=0;    int s=0;    printf("please input a strin

數值存入到byte陣列中

需求:如用4個位元組byte b[4]表示整型數值i,要求將i的值轉換到byte b[4]中; 分析:簡單而高效的方法是用位運算來取值;byte b[4]能表示的整型值範圍是[0, 4294967295],需要用型別u

比較測試map、unodered_map、unordered_set效能效率數值查詢

測試環境: centos 6.5 gcc 4.4.3 使用boost庫生成均勻分佈的隨機正整形數字。 1、分別建立三個資料集物件 typedefunsignedintUINT32; std::unordered_map<UINT32,UINT32> tes

三種方法實現數值交換

int 異或 交換 實現 整型 數值交換 臨時 變量 a+b 臨時變量法: int a = 5; int b = 4; int temp = 0; temp = a; a = b; b = temp; 異或法: int a = 5; int b = 6; a = a^b;

Java中數值==和equals的處理

前言: equals 比較內容, == 比較地址。 PS. equals在Object類中,作用和==完全是一樣的,都是對物件地址的比較,不是比較值。 在String類中,equals被重寫成了字串的具體值的比較,而不再是地址比較。   ==: 1)基本型別之間

程式實現兩個數值的交換

題目:請寫出一個小程式,實現對兩個整型數值一個和b的交換 思路1:交換兩個數值,最一般的做法,是建立一個臨時變數臨時,這個變數我們需要的不是它具體的值起到什麼作用,而是要借用它所開闢出來的空間,進行被交換變數的暫時存放將一個的值存入臨時,再將b存入一箇中,然後再將溫度裡存的一個的值放入b中,即可實現一個與b

程序實現兩個數值的交換

進行 element bsp 問題 info printf lin UNC sof 題目:請寫出一個小程序,實現對兩個整型數值一個和b的交換 思路1:交換兩個數值,最一般的做法,是創建一個臨時變量臨時,這個變量我們需要的不是它具體的值起到什麽作用,而是要借用它所開辟出來的空

關於Java中的遞迴操作--(以一個正十進位制數轉換為二進位制數為例)

遞迴操作是函式一直在呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式

javaScript中字串浮點之間的轉換

var a=3; var b='213'; a=parseInt(b); var c=0.5; var d='0.98'; d=parsetFloat(c); var e='ff'; var f=999; e=''+f; 參考url: http://www.intern

MFC中CString與字元陣列與的相互轉換

int a;char ch[20]; CString str; 字元陣列轉整型: a=_ttoi(str); CString轉字元陣列: strcpy(ch,CW2A(str)); char[],int轉CString: str=CString(ch); str.Forma

字串和整形浮點之間的轉換函式

static char *itoa(int value, char *string, int radix) {     int i, d;     int flag = 0;     char *ptr = string;          /* This implementation only works

MySql 基礎學習筆記 1——概述與基本數據類: 1)TINYINT 2)SMALLINT 3) MEDIUMINT 4)INT 5)BIGINT 主要是大小的差別 圖 浮點:命令

where float 函數名 src ron 編碼方式 永遠 -m mas 一、CMD中經常使用mysql相關命令 mysql -D, --database=name //打開數據庫 --delimiter=name //指定分隔符 -h, --host=na

python 從鍵盤輸入一個字串小寫字母全部轉換成大寫字母,字串以列表的形式輸出(如果字串包含整數取)?

str1 = input("請輸入任意字串: ") list1= [] #儲存字串 list2= [] #儲存數字 for i in str1: if i.isdigit() == True: #判斷當前字元是否為字元 list2.append(int(i)) else:

兩個陣列按照升序排列並且過濾掉重複陣列元素

解題思路:   1. 先將兩個陣列進行合併,可以利用C語言的memcpy函式進行;   2. 將新陣列進行氣泡排序;   3. 過濾掉重複元素; 程式碼如下: #include <stdlib.h> #include<string.h> //氣泡排序 void sortA

編寫一個程式對一個陣列的元素求和結果使用全域性變數sum儲存另外對陣列元素中的奇數求和結果使用區域性變數sum儲存在主程式兩個結果輸出。

#include<iostream> using namespace std; int sum_1(int a[]);//定義計算奇數的和; int main() { int a[]={1,2,3,4,5,6,7,8,9,10};//定義陣列並附初值; int i,sum=0,s

python中如何字串轉換為數字(數字轉換字串的10轉換的1010.5轉換為10

說明:   在實際的應用過程中,有的時候可能會遇到字串的10,需要將字串的10轉換為數字的10   在此記錄下,通過int函式轉換的過程。 操作過程: 1.將字串轉換為整型的10 >>> str1 = "10" #將一個字串的10賦給變數str1 >&g

給定兩個變數的值兩個值的內容進行交換

#include <stdio.h> #include<stdlib.h> void main() { int num; int a = 10; int b = 20; num = a; a = b; b = num; printf("a=%d\n", a);

給定兩個變數的值兩個值得內容進行交換。

1.利用新的變數進行替換,程式碼如下: int main() { int a = 10; int b = 90; int tmp = 0; tmp = a; a = b; b = tmp; printf("%d %d", a, b);