iOS開發iOS演算法
⑴ iOS 開發中都會使用哪些演算法
md5
base64
sha1
HMAC_SHA1
歸並排序, 這個是有2個已經排序好的數組, 要組成一個新數組, 手動實現了一遍歸並排序, 但是感受不出效率
各種圖片演算法, 直接用的GPUImage
⑵ 簡單講解iOS應用開發中的MD5加密的使用
一、簡單說明
1.說明
在開發應用的時候,數據的安全性至關重要,而僅僅用POST請求提交用戶的隱私數據,還是不能完全解決安全問題。
如:可以利用軟體(比如Charles)設置代理伺服器,攔截查看手機的請求數據
「青花瓷」軟體
因此:提交用戶的隱私數據時,一定不要明文提交,要加密處理後再提交
2.常見的加密演算法
MD5 SHA DES 3DES RC2和RC4 RSA IDEA DSA AES
3.加密演算法的選擇
一般公司都會有一套自己的加密方案,按照公司介面文檔的規定去加密
二、MD5
1.簡單說明
MD5:全稱是Message Digest Algorithm 5,譯為「消息摘要演算法第5版」
效果:對輸入信息生成唯一的.128位散列值(32個字元)
2.MD5的特點
(1)輸入兩個不同的明文不會得到相同的輸出值
(2)根據輸出值,不能得到原始的明文,即其過程不可逆
3.MD5的應用
由於MD5加密演算法具有較好的安全性,而且免費,因此該加密演算法被廣泛使用
主要運用在數字簽名、文件完整性驗證以及口令加密等方面
4.MD5破解
MD5解密網站:http://www.cmd5.com
5.MD5改進
現在的MD5已不再是絕對安全,對此,可以對MD5稍作改進,以增加解密的難度
加鹽(Salt):在明文的固定位置插入隨機串,然後再進行MD5
先加密,後亂序:先對明文進行MD5,然後對加密得到的MD5串的字元進行亂序
總之宗旨就是:黑客就算攻破了資料庫,也無法解密出正確的明文
代碼示例:
復制代碼 代碼如下:
#import "HMViewController.h"
#import "NSString+Hash.h"
#define Salt @"fsdhjkfhjksdhjkfjhkd546783765"
@interface HMViewController ()
@end
@implementation HMViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self digest:@"123"]; //
[self digest:@"abc"];
[self digest:@"456"];
}
/**
* 直接用MD5加密
*/
- (NSString *)digest:(NSString *)str
{
NSString *anwen = [str md5String];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
/**
* 加鹽
*/
- (NSString *)digest2:(NSString *)str
{
str = [str stringByAppendingString:Salt];
NSString *anwen = [str md5String];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
/**
* 多次MD5
*/
- (NSString *)digest3:(NSString *)str
{
NSString *anwen = [str md5String];
anwen = [anwen md5String];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
/**
* 先加密, 後亂序
*/
- (NSString *)digest4:(NSString *)str
{
NSString *anwen = [str md5String];
// 注冊: 123 ----
// 登錄: 123 ---
NSString *header = [anwen substringToIndex:2];
NSString *footer = [anwen substringFromIndex:2];
anwen = [footer stringByAppendingString:header];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
@end
(1)直接使用MD5加密(去MD5解密網站即可破解)
(2)使用加鹽(通過MD5解密之後,很容易發現規律)
(3)多次MD5加密(使用MD5解密之後,發現還是密文,那就接著MD5解密)
(4)先加密,後亂序(破解難度增加)
三、注冊和驗證的數據處理過程
1.提交隱私數據的安全過程 – 注冊
2.提交隱私數據的安全過程 – 登錄
⑶ iOS面試題12-數據結構演算法篇
《 2018 iOS面試題系列 》
這里沒有圖啊,大家可以抽象一下。
數據結構的存儲一般常用的有兩種 順序存儲結構 和 鏈式存儲結構
發揮想像力啊。 舉個列子。數組。1-2-3-4-5-6-7-8-9-10。這個就是一個順序存儲結構 ,存儲是按順序的 舉例說明啊。 棧。做開發的都熟悉。棧是先進後出 ,後進先出的形式 對不對 ?!他的你可以這樣理解
hello world 在棧裡面從棧底到棧頂的邏輯依次為 h-e-l-l-o-w-o-r-l-d 這就是順序存儲 再比如 隊列 ,隊列是先進先出的對吧,從頭到尾 h-e-l-l-o-w-o-r-l-d 就是這樣排對的
再次發揮想像力 這個稍微復雜一點 這個圖片我一直弄好 ,回頭找美工問問,再貼上 例如 還是一個數組
1-2-3-4-5-6-7-8-9-10 鏈式存儲就不一樣了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)。每個數字後面跟著一個地址 而且存儲形式不再是順序 ,也就說順序亂了,1(地址) 1後面跟著的這個地址指向的是2,2後面的地址指向的是3,3後面的地址指向是誰你應該清楚了吧。他執行的時候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址),但是存儲的時候就是完全隨機的。明白了?!
還是舉例子。理解最重要。不要去死記硬背 哪些什麼。定義啊。邏輯啊。理解才是最重要滴
二叉樹有五種表現形式
二叉樹可以轉換成森林 樹也可以轉換成二叉樹。這里就不介紹了 你做項目絕對用不到
數據結構大致介紹這么多吧。理解為主, 別死記,死記沒什麼用
從現在開始介紹演算法啊
二叉樹這個比較麻煩 還有平衡二叉樹 有點繞 如果不懂二叉樹這一塊 你是百分之二百看不懂的
原文鏈接
⑷ iOS開發面試拿offer攻略之數據結構與演算法篇附加安全加密
集合結構 線性結構 樹形結構 圖形結構
1.1、集合結構 說白了就是一個集合,就是一個圓圈中有很多個元素,元素與元素之間沒有任何關系 這個很簡單
1.2、線性結構 說白了就是一個條線上站著很多個人。 這條線不一定是直的。也可以是彎的。也可以是值的 相當於一條線被分成了好幾段的樣子 (發揮你的想像力)。 線性結構是一對一的關系
1.3、樹形結構 說白了 做開發的肯定或多或少的知道 xml 解析 樹形結構跟他非常類似。也可以想像成一個金字塔。樹形結構是一對多的關系
1.4、圖形結構 這個就比較復雜了。他呢 無窮。無邊 無向(沒有方向)圖形機構 你可以理解為多對多 類似於我們人的交集關系
數據結構的存儲
數據結構的存儲一般常用的有兩種 順序存儲結構 和 鏈式存儲結構
2.1 順序存儲結構
發揮想像力啊。 舉個列子。數組。1-2-3-4-5-6-7-8-9-10。這個就是一個順序存儲結構 ,存儲是按順序的 舉例說明啊。 棧,做開發的都熟悉。棧是先進後出 ,後進先出的形式 對不對 ?
他的你可以這樣理解, hello world 在棧裡面從棧底到棧頂的邏輯依次為 h-e-l-l-o-w-o-r-l-d 這就是順序存儲,再比如隊列 ,隊列是先進先出的對吧,從頭到尾 h-e-l-l-o-w-o-r-l-d 就是這樣排對的
2.2 鏈式存儲結構
再次發揮想像力 這個稍微復雜一點 這個圖片我一直弄好 ,回頭找美工問問,再貼上 例如 還是一個數組 1-2-3-4-5-6-7-8-9-10 鏈式存儲就不一樣了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)。每個數字後面跟著一個地址 而且存儲形式不再是順序 ,也就說順序亂了,1(地址) 1 後面跟著的這個地址指向的是 2,2 後面的地址指向的是 3,3 後面的地址指向是誰你應該清楚了吧。他執行的時候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址),但是存儲的時候就是完全隨機的。明白了?
單向鏈表雙向鏈表循環鏈表
還是舉例子。理解最重要。不要去死記硬背 哪些什麼。定義啊。邏輯啊。理解才是最重要滴
3.1 單向鏈表
A->B->C->D->E->F->G->H . 這就是單向鏈表 H 是頭 A 是尾 像一個只有一個頭的火車一樣 只能一個頭拉著跑
3.2 雙向鏈表
數組和鏈表區別:
數組:數組元素在內存上連續存放,可以通過下標查找元素;插入、刪除需要移動大量元素,比較適用元素很少變化的情況
鏈表:鏈表中的元素在內存中不是順序存儲的,查找慢,插入、刪除只需要對元素指針重新賦值,效率高
3.3 循環鏈表
循環鏈表是與單向鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個結點的指針是指向該循環鏈表的第一個結點或者表頭結點,從而構成一個環形的鏈。發揮想像力 A->B->C->D->E->F->G->H->A . 繞成一個圈。就像蛇吃自己的這就是循環 不需要去死記硬背哪些理論知識。
二叉樹/平衡二叉樹
4.1 什麼是二叉樹
樹形結構下,兩個節點以內 都稱之為二叉樹 不存在大於 2 的節點 分為左子樹 右子樹 有順序 不能顛倒 ,懵逼了吧,你肯定會想這是什麼玩意,什麼左子樹右子樹 ,都什麼跟什麼鬼? 現在我以普通話再講一遍,你把二叉樹看成一個人 ,人的頭呢就是樹的根 ,左子樹就是左手,右子樹就是右手,左右手可以都沒有(殘疾嘛,聲明一下,絕非歧視殘疾朋友,勿怪,勿怪就是舉個例子, I am very sorry ) , 左右手呢可以有一個,就是不能顛倒。這樣講應該明白了吧
二叉樹有五種表現形式
1.空的樹(沒有節點)可以理解為什麼都沒 像空氣一樣
2.只有根節點。 (理解一個人只有一個頭 其他的什麼都沒,說的有點恐怖)
3.只有左子樹 (一個頭 一個左手 感覺越來越寫不下去了)
4.只有右子樹
5.左右子樹都有
二叉樹可以轉換成森林 樹也可以轉換成二叉樹。這里就不介紹了 你做項目絕對用不到數據結構大致介紹這么多吧。理解為主, 別死記,死記沒什麼用
1、不用中間變數,用兩種方法交換 A 和 B 的值
2、****求最大公約數
3、模擬棧操作
棧是一種數據結構,特點:先進後出 -
練習:使用全局變數模擬棧的操作
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
//保護全局變數:在全局變數前加 static 後,這個全局變數就只能在本文件中使用 static int data[1024] ;//棧最多能保存 1024 個數據
static int count = 0 ;//目前已經放了多少個數(相當於棧頂位置)
4、排序演算法
選擇排序、冒泡排序、插入排序三種排序演算法可以總結為如下:
都將數組分為已排序部分和未排序部分。
1.選擇排序將已排序部分定義在左端,然後選擇未排序部分的最小元素和未排序部分的第一個元素交換。
2.冒泡排序將已排序部分定義在右端,在遍歷未排序部分的過程執行交換,將最大元素交換到最右端。
3.插入排序將已排序部分定義在左端,將未排序部分元的第一個元素插入到已排序部分合適的位置。
4.1、選擇排序
【選擇排序】:最值出現在起始端
第 1 趟:在 n 個數中找到最小(大)數與第一個數交換位置
第 2 趟:在剩下 n-1 個數中找到最小(大)數與第二個數交換位置
重復這樣的操作...依次與第三個、第四個...數交換位置
第 n-1 趟,最終可實現數據的升序(降序)排列。
4.2、冒泡排序
【冒泡排序】:相鄰元素兩兩比較,比較完一趟,最值出現在末尾
第 1 趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第 n 個元素位置
第 2 趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第 n-1 個元素位置
…… ……
第 n-1 趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第 2 個元素位置
5、折半查找(二分查找)
折半查找:優化查找時間(不用遍歷全部數據) 折半查找的原理:
1.數組必須是有序的
2.必須已知 min 和 max (知道範圍)
// 已知一個有序數組, 和一個 key , 要求從數組中找到 key 對應的索引位置
字元串反轉
給定字元串 " hello,world ",實現將其反轉。輸出結果: dlrow , olleh
序數組合並
將有序數組 {1,4,6,7,9} 和 {2,3,5,6,8,9,10,11,12} 合並為{1,2,3,4,5,6,6,7,8,9,9,10,11,12}
HASH 演算法
哈希表
例:給定值是字母 a ,對應 ASCII 碼值是 97,數組索引下標為 97。
這里的 ASCII 碼,就算是一種哈希函數,存儲和查找都通過該函數,有效地提高查找效率。
在一個字元串中找到第一個只出現一次的字元。如輸入" abaccdeff ",輸出' b '字元( char )是一個長度為 8 的數據類型,因此總共有 256 種可能。每個字母根據其 ASCII 碼值作為數組下標對應數組種的一個數字。數組中存儲的是每個字元出現的次數。
查找兩個子視圖的共同父視圖
思路:分別記錄兩個子視圖的所有父視圖並保存到數組中,然後倒序尋找,直至找到第一個不一樣的父視圖。
求無序數組中的中位數
中位數:當數組個數 n 為奇數時,為 (n + 1)/2 ,即是最中間那個數字;當 n 為偶數時,為 (n/2 + (n/2 + 1))/2 , 即是中間兩個數字的平均數。
首先要先去了解一些幾種排序演算法: iOS 排序演算法
思路:
1.排序演算法+中位數
首先用冒泡排序、快速排序、堆排序、希爾排序等排序演算法將所給數組排序,然後取出其中位數即可。
2.利用快排思想
1、簡述 SSL 加密的過程用了哪些加密方法,為何這么作?
SSL 加密的過程之前有些過,此處不再贅述。
SSL 加密,在過程中實際使用了 對稱加密 和 非對稱加密 的結合。
主要的考慮是先使用 非對稱加密 進行連接,這樣做是為了避免中間人攻擊秘鑰被劫持,但是 非對稱加密的效率比較低。所以一旦建立了安全的連接之後,就可以使用輕量的 對稱加密。
2、RSA 非對稱加密
對稱加密[演算法]在加密和解密時使用的是同一個秘鑰;而[非對稱加密演算法]需要兩個[密鑰]來進行加密和解密,這兩個秘鑰是[公開密鑰]( public key ,簡稱公鑰)和私有密鑰( private key ,簡稱私鑰)。
RSA 加密
與對稱加密[演算法]不同,[非對稱加密演算法]需要兩個[密鑰]:[公開密鑰]( publickey )和私有密鑰( privatekey )。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的[密鑰],所以這種演算法叫作[非對稱加密演算法]。
RSA**** 加密原理
RSA 是常用的加密模式,其加密原理可用以下的例子進行簡要的論述。
隨機取兩個質數
以上就是本篇所整理的,感謝觀看!
⑸ IOS 演算法(基礎篇) ----- 兩個數組的交集
例子:
輸入派閉行:nums1 = [1,2,3,4], nums2 = [2,2]
輸出:[2]
輸入:nums1 = [7,9,8], nums2 = [9,4,9,8,4,5,10]
輸出:[9,8]
1.先Set方法去重num1, 減少循環, let set1 = Set(nums1)
(Set和Array的區別在於,Set是無塵嘩序的,且Set中不能存在重態畢復的元素)
2.遍歷set1, 如果num2包含 , result就插入
/// Returns a new set with the elements that are common to both this set and
/// the given sequence.
///
/// In the following example, the bothNeighborsAndEmployees set is made up
/// of the elements that are in both the employees and neighbors sets.
/// Elements that are in only one or the other are left out of the result of
/// the intersection.
///
/// let employees: Set = ["Alicia", "Bethany", "Chris", "Diana", "Eric"]
/// let neighbors: Set = ["Bethany", "Eric", "Forlani", "Greta"]
/// let bothNeighborsAndEmployees = employees.intersection(neighbors)
/// print(bothNeighborsAndEmployees)
/// // Prints "["Bethany", "Eric"]"