本文目錄一覽:
- 1、java最常用的幾種加密演算法
- 2、java數字圖像處理常用演算法
- 3、Java的排序演算法有哪些
- 4、java中的演算法,一共有多少種,哪幾種,怎麼分類。
- 5、java迭代演算法和迭代器的區別
- 6、為什麼java面試演算法特別多
java最常用的幾種加密演算法
簡單的Java加密演算法有:
第一種. BASE
Base是網路上最常見的用於傳輸Bit位元組代碼的編碼方式之一,大家可以查看RFC~RFC,上面有MIME的詳細規範。Base編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base來將一個較長的唯一標識符(一般為-bit的UUID)編碼為一個字元串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進位數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
第二種. MD
MD即Message-Digest Algorithm (信息-摘要演算法),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、哈希演算法),主流編程語言普遍已有MD實現。將數據(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,MD的前身有MD、MD和MD。
MD演算法具有以下特點:
壓縮性:任意長度的數據,算出的MD值長度都是固定的。
容易計算:從原數據計算出MD值很容易。
抗修改性:對原數據進行任何改動,哪怕只修改個位元組,所得到的MD值都有很大區別。
弱抗碰撞:已知原數據和其MD值,想找到一個具有相同MD值的數據(即偽造數據)是非常困難的。
強抗碰撞:想找到兩個不同的數據,使它們具有相同的MD值,是非常困難的。
MD的作用是讓大容量信息在用數字簽名軟體簽署私人密鑰前被」壓縮」成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進位數字串)。除了MD以外,其中比較有名的還有sha-、RIPEMD以及Haval等。
第三種.SHA
安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於^位的消息,SHA會產生一個位的消息摘要。該演算法經過加密專家多年來的發展和改進已日益完善,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數值可以說是對明文的一種「指紋」或是「摘要」所以對散列值的數字簽名就可以視為對此明文的數字簽名。
SHA-與MD的比較
因為二者均由MD導出,SHA-和MD彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:
對強行攻擊的安全性:最顯著和最重要的區別是SHA-摘要比MD摘要長 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD是^數量級的操作,而對SHA-則是^數量級的操作。這樣,SHA-對強行攻擊有更大的強度。
對密碼分析的安全性:由於MD的設計,易受密碼分析的攻擊,SHA-顯得不易受這樣的攻擊。
速度:在相同的硬體上,SHA-的運行速度比MD慢。
第四種.HMAC
HMAC(Hash Message Authentication Code,散列消息鑒別碼,基於密鑰的Hash演算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,然後傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。
java數字圖像處理常用演算法
前些時候做畢業設計 用java做的數字圖像處理方面的東西 這方面的資料ms比較少 發點東西上來大家共享一下 主要就是些演算法 有自己寫的 有人家的 還有改人家的 有的演算法寫的不好 大家不要見笑
一 讀取bmp圖片數據
// 獲取待檢測圖像 數據保存在數組 nData[] nB[] nG[] nR[]中
public void getBMPImage(String source) throws Exception { clearNData(); //清除數據保存區 FileInputStream fs = null; try { fs = new FileInputStream(source); int bfLen = ; byte bf[] = new byte[bfLen]; fs read(bf bfLen); // 讀取 位元組BMP文件頭 int biLen = ; byte bi[] = new byte[biLen]; fs read(bi biLen); // 讀取 位元組BMP信息頭
// 源圖寬度 nWidth = (((int) bi[ ] xff) ) | (((int) bi[ ] xff) ) | (((int) bi[ ] xff) ) | (int) bi[ ] xff;
// 源圖高度 nHeight = (((int) bi[ ] xff) ) | (((int) bi[ ] xff) ) | (((int) bi[ ] xff) ) | (int) bi[ ] xff;
// 位數 nBitCount = (((int) bi[ ] xff) ) | (int) bi[ ] xff;
// 源圖大小 int nSizeImage = (((int) bi[ ] xff) ) | (((int) bi[ ] xff) ) | (((int) bi[ ] xff) ) | (int) bi[ ] xff;
// 對 位BMP進行解析 if (nBitCount == ){ int nPad = (nSizeImage / nHeight) nWidth * ; nData = new int[nHeight * nWidth]; nB=new int[nHeight * nWidth]; nR=new int[nHeight * nWidth]; nG=new int[nHeight * nWidth]; byte bRGB[] = new byte[(nWidth + nPad) * * nHeight]; fs read(bRGB (nWidth + nPad) * * nHeight); int nIndex = ; for (int j = ; j nHeight; j++){ for (int i = ; i nWidth; i++) { nData[nWidth * (nHeight j ) + i] = ( xff) | (((int) bRGB[nIndex + ] xff) ) | (((int) bRGB[nIndex + ] xff) ) | (int) bRGB[nIndex] xff; nB[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex] xff; nG[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ] xff; nR[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ] xff; nIndex += ; } nIndex += nPad; } // Toolkit kit = Toolkit getDefaultToolkit(); // image = kit createImage(new MemoryImageSource(nWidth nHeight // nData nWidth));
/* //調試數據的讀取
FileWriter fw = new FileWriter( C:\\Documents and Settings\\Administrator\\My Documents\\nDataRaw txt );//創建新文件 PrintWriter out = new PrintWriter(fw); for(int j= ;jnHeight;j++){ for(int i= ;inWidth;i++){ out print(( * +nData[nWidth * (nHeight j ) + i])+ _ +nR[nWidth * (nHeight j ) + i]+ _ +nG[nWidth * (nHeight j ) + i]+ _ +nB[nWidth * (nHeight j ) + i]+ ); } out println( ); } out close();*/ } } catch (Exception e) { e printStackTrace(); throw new Exception(e); } finally { if (fs != null) { fs close(); } } // return image; }
二 由r g b 獲取灰度數組
public int[] getBrightnessData(int rData[] int gData[] int bData[]){ int brightnessData[]=new int[rData length]; if(rData length!=gData length || rData length!=bData length || bData length!=gData length){ return brightnessData; } else { for(int i= ;ibData length;i++){ double temp= *rData[i]+ *gData[i]+ *bData[i]; brightnessData[i]=(int)(temp)+((temp (int)(temp)) ? : ); } return brightnessData; } }
三 直方圖均衡化
public int [] equilibrateGray(int[] PixelsGray int width int height) { int gray; int length=PixelsGray length; int FrequenceGray[]=new int[length]; int SumGray[]=new int[ ]; int ImageDestination[]=new int[length]; for(int i = ; i length ;i++) { gray=PixelsGray[i]; FrequenceGray[gray]++; } // 灰度均衡化 SumGray[ ]=FrequenceGray[ ]; for(int i= ;i ;i++){ SumGray[i]=SumGray[i ]+FrequenceGray[i]; } for(int i= ;i ;i++) { SumGray[i]=(int)(SumGray[i]* /length); } for(int i= ;iheight;i++) { for(int j= ;jwidth;j++) { int k=i*width+j; ImageDestination[k]= xFF | ((SumGray[PixelsGray[k]] ) | (SumGray[PixelsGray[k]] ) | SumGray[PixelsGray[k]]); } } return ImageDestination; }
四 laplace 階濾波 增強邊緣 圖像銳化
public int[] laplace DFileter(int []data int width int height){ int filterData[]=new int[data length]; int min= ; int max= ; for(int i= ;iheight;i++){ for(int j= ;jwidth;j++){ if(i== || i==height || j== || j==width ) filterData[i*width+j]=data[i*width+j]; else filterData[i*width+j]= *data[i*width+j] data[i*width+j ] data[i*width+j+ ] data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ] data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ]; if(filterData[i*width+j]min) min=filterData[i*width+j]; if(filterData[i*width+j]max) max=filterData[i*width+j]; } }// System out println( max: +max);// System out println( min: +min); for(int i= ;iwidth*height;i++){ filterData[i]=(filterData[i] min)* /(max min); } return filterData; }
五 laplace 階增強濾波 增強邊緣 增強係數delt
public int[] laplaceHigh DFileter(int []data int width int height double delt){ int filterData[]=new int[data length]; int min= ; int max= ; for(int i= ;iheight;i++){ for(int j= ;jwidth;j++){ if(i== || i==height || j== || j==width ) filterData[i*width+j]=(int)(( +delt)*data[i*width+j]); else filterData[i*width+j]=(int)(( +delt)*data[i*width+j] data[i*width+j ]) data[i*width+j+ ] data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ] data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ]; if(filterData[i*width+j]min) min=filterData[i*width+j]; if(filterData[i*width+j]max) max=filterData[i*width+j]; } } for(int i= ;iwidth*height;i++){ filterData[i]=(filterData[i] min)* /(max min); } return filterData; } 六 局部閾值處理 值化
// 局部閾值處理 值化 niblack s method /*原理 T(x y)=m(x y) + k*s(x y) 取一個寬度為w的矩形框 (x y)為這個框的中心 統計框內數據 T(x y)為閾值 m(x y)為均值 s(x y)為均方差 k為參數(推薦 )計算出t再對(x y)進行切割 / 這個演算法的優點是 速度快 效果好 缺點是 niblack s method會產生一定的雜訊 */ public int[] localThresholdProcess(int []data int width int height int w int h double coefficients double gate){ int[] processData=new int[data length]; for(int i= ;idata length;i++){ processData[i]= ; } if(data length!=width*height) return processData; int wNum=width/w; int hNum=height/h; int delt[]=new int[w*h]; //System out println( w; +w+ h: +h+ wNum: +wNum+ hNum: +hNum); for(int j= ;jhNum;j++){ for(int i= ;iwNum;i++){ //for(int j= ;j ;j++){ // for(int i= ;i ;i++){ for(int n= ;nh;n++) for(int k= ;kw;k++){ delt[n*w+k]=data[(j*h+n)*width+i*w+k]; //System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ ); } //System out println(); /* for(int n= ;nh;n++) for(int k= ;kw;k++){ System out print( data[ +((j*h+n)*width+i*w+k)+ ]: +data[(j*h+n)*width+i*w+k]+ ); } System out println(); */ delt=thresholdProcess(delt w h coefficients gate); for(int n= ;nh;n++) for(int k= ;kw;k++){ processData[(j*h+n)*width+i*w+k]=delt[n*w+k]; // System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ ); } //System out println(); /* for(int n= ;nh;n++) for(int k= ;kw;k++){ System out print( processData[ +((j*h+n)*width+i*w+k)+ ]: +processData[(j*h+n)*width+i*w+k]+ ); } System out println(); */ } } return processData; }
七 全局閾值處理 值化
public int[] thresholdProcess(int []data int width int height double coefficients double gate){ int [] processData=new int[data length]; if(data length!=width*height) return processData; else{ double sum= ; double average= ; double variance= ; double threshold; if( gate!= ){ threshold=gate; } else{ for(int i= ;iwidth*height;i++){ sum+=data[i]; } average=sum/(width*height); for(int i= ;iwidth*height;i++){ variance+=(data[i] average)*(data[i] average); } variance=Math sqrt(variance); threshold=average coefficients*variance; } for(int i= ;iwidth*height;i++){ if(data[i]threshold) processData[i]= ; else processData[i]= ; } return processData; } }
八 垂直邊緣檢測 sobel運算元
public int[] verticleEdgeCheck(int []data int width int height int sobelCoefficients) throws Exception{ int filterData[]=new int[data length]; int min= ; int max= ; if(data length!=width*height) return filterData; try{ for(int i= ;iheight;i++){ for(int j= ;jwidth;j++){ if(i== || i== || i==height || i==height ||j== || j== || j==width || j==width ){ filterData[i*width+j]=data[i*width+j]; } else{ double average; //中心的九個像素點 //average=data[i*width+j] Math sqrt( )*data[i*width+j ]+Math sqrt( )*data[i*width+j+ ] average=data[i*width+j] sobelCoefficients*data[i*width+j ]+sobelCoefficients*data[i*width+j+ ] data[(i )*width+j ]+data[(i )*width+j+ ] data[(i+ )*width+j ]+data[(i+ )*width+j+ ]; filterData[i*width+j]=(int)(average); } if(filterData[i*width+j]min) min=filterData[i*width+j]; if(filterData[i*width+j]max) max=filterData[i*width+j]; } } for(int i= ;iwidth*height;i++){ filterData[i]=(filterData[i] min)* /(max min); } } catch (Exception e) { e printStackTrace(); throw new Exception(e); } return filterData; }
九 圖像平滑 * 掩模處理(平均處理) 降低雜訊
lishixinzhi/Article/program/Java/hx/201311/26286
Java的排序演算法有哪些
java的排序大的分類可以分為兩種:內排序和外排序。在排序過程中,全部記錄存放在內存,則稱為內排序,如果排序過程中需要使用外存,則稱為外排序。下面講的排序都是屬於內排序。
1.插入排序:直接插入排序、二分法插入排序、希爾排序。
2.選擇排序:簡單選擇排序、堆排序。
3.交換排序:冒泡排序、快速排序。
4.歸併排序
5.基數排序
java中的演算法,一共有多少種,哪幾種,怎麼分類。
就好比問,漢語中常用寫作方法有多少種,怎麼分類。
演算法按用途分,體現設計目的、有什麼特點
演算法按實現方式分,有遞歸、迭代、平行、序列、過程、確定、不確定等等
演算法按設計范型分,有分治、動態、貪心、線性、圖論、簡化等等
作為圖靈完備的語言,理論上」Java語言「可以實現所有演算法。
「Java的標準庫’中用了一些常用數據結構和相關演算法.
像apache common這樣的java庫中又提供了一些通用的演算法
java迭代演算法和迭代器的區別
形式不同。
java迭代演算法是一種不斷用變數的舊值遞推出新值的解決問題的方法;java迭代器是程序設計的軟體設計模式。
java迭代器可在容器對象(container,例如鏈表或數組)上遍訪的介面,設計人員無需關心容器對象的內存分配的實現細節。
為什麼java面試演算法特別多
因為演算法是比較基礎又複雜的學科。
這就是沒理解這道題考察的意圖,不是考察你javaAPI的使用,而是看看你的思維和代碼編程能力。開發工程師的主要工作就是處理各種邏輯。比如給你一個真實的工作需求,讓你把一個數據作排序,但是相同的數只保留兩個,或者給一個字元串按第個字母進行排序。只會使用API或者粘貼複製是遠遠不夠的,而排序演算法是邏輯最直接的,最好表達,也是行數較少的思維考查,所以筆試面試里見面的次數就比較多。
Java是一門面向對象的編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行複雜的編程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/196355.html