欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python UDF 實(shí)現(xiàn)對(duì)csv批量md5加密操作

 更新時(shí)間:2021年01月01日 13:30:18   作者:lee_moonj  
這篇文章主要介紹了python UDF 實(shí)現(xiàn)對(duì)csv批量md5加密操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

工作上遇到需求,一批手機(jī)號(hào)要md5加密導(dǎo)出。為了保證數(shù)據(jù)安全,所以沒有采用網(wǎng)上工具來加密。

md5的加密算法是開源的且成熟的,很多語(yǔ)言都有對(duì)應(yīng)包可以直接用,我寫了一個(gè)簡(jiǎn)單的python來實(shí)現(xiàn),另一位同事做了一個(gè)hiveUDF來實(shí)現(xiàn),這里都給大家分享一下。

目標(biāo):

讀取csv文件,并且對(duì)其中的內(nèi)容進(jìn)行md5加密,32位加密,將加密后的密文存入另一個(gè)csv文件。

python實(shí)現(xiàn):

(1)準(zhǔn)備好要讀取的csv文件。單列,一行存一個(gè)手機(jī)號(hào)碼。

(2)python代碼:

#encoding=utf8
import hashlib #加密模塊
import os

#定義一個(gè)加密函數(shù),32位md5加密
def md5_encryption(str):
 m=hashlib.md5()
 m.update(str)
 return m.hexdigest()

#準(zhǔn)備要讀取的csv和要被寫入的csv,兩個(gè)文件要和此python放在同一個(gè)文件夾里
readfilename=os.path.join(os.path.dirname(__file__),"testcsv.csv")
writefilename=os.path.join(os.path.dirname(__file__),"writecsv.csv")
print('read:',readfilename)
print('write:',writefilename)

with open(readfilename,'r') as rf:
 #逐行寫入加密后的密文,strip函數(shù)用于剔除換行符\n,不然是對(duì)“13000000\n”加密而不是對(duì)“13000000”加密
 with open(writefilename,'w') as wf: 
 for row in rf.readlines():
  wf.write(md5_encryption(row.strip())) 
  wf.write('\n')
 #計(jì)算一下寫入的行數(shù)
 with open(writefilename,'r') as rwf:
 count=0
 while 1:
  buffer=rwf.read(1024*8192)
  if not buffer:
  break
  count+=buffer.count('\n')
 print('line writed number:',count)

(3)結(jié)果

hive UDF 實(shí)現(xiàn):

(1)用java寫一個(gè)類用來實(shí)現(xiàn)加密,用maven打成jar包

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.commons.lang.StringUtils;
import java.security.MessageDigest;
public class MD5 extends UDF {
 public String evaluate (final String str) {
 if (StringUtils.isBlank(str)){
  return "";
 }
 String digest = null;
 StringBuffer buffer = new StringBuffer();
 try {
  MessageDigest digester = MessageDigest.getInstance("md5");
  byte[] digestArray = digester.digest(str.getBytes("UTF-8"));
  for (int i = 0; i < digestArray.length; i++) {
  buffer.append(String.format("%02x", digestArray[i]));
  }
  digest = buffer.toString();
 } catch (Exception e) {
  e.printStackTrace();
 }
 return digest;
 }
 public static void main (String[] args ) {
 MD5 md5 = new MD5();
 System.out.println(md5.evaluate(" "));
 }
}


(2)配置一下pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>HiveUdf</groupId>
 <artifactId>HiveUdf</artifactId>
 <version>1.0-SNAPSHOT</version>

 <dependencies>
 <dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>0.14.0</version>
 </dependency>
 <dependency>
  <groupId>org.apache.calcite</groupId>
  <artifactId>calcite-core</artifactId>
  <version>0.9.2-incubating</version>
 </dependency>
 <dependency>
  <groupId>org.apache.calcite</groupId>
  <artifactId>calcite-avatica</artifactId>
  <version>0.9.2-incubating</version>
 </dependency>
 <dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.6.0</version>
 </dependency>
 </dependencies>
</project>

(3)hive中配置udf

導(dǎo)入jar包:

hive> add jar hdfs:/user/udf/HiveUdf-1.0-SNAPSHOT.jar;

新建一個(gè)函數(shù):

hive> create temporary function MD5 as 'MD5';

使用:

hive> select MD5('12345');
OK
827ccb0eea8a706c4c34a16891f84e7b
Time taken: 0.139 seconds, Fetched: 1 row(s)
hive> 
hive> select phone,MD5(phone) from mid_latong_20200414 limit 5;
OK
1300****436 856299f44928e90****181b0cc1758c4
1300****436 856299f44928e90****181b0cc1758c4
1300****689 771dfa9ef00f43c****4901a3f1d1fa0
1300****689 771dfa9ef00f43c****4901a3f1d1fa0
1300****689 771dfa9ef00f43c****4901a3f1d1fa0
Time taken: 0.099 seconds, Fetched: 5 row(s)

以上就是python和hiveUDF兩種實(shí)現(xiàn)md5加密的方法啦!

補(bǔ)充:python的MD5加密的一點(diǎn)坑

曾經(jīng)在做某ctf題目時(shí),被這點(diǎn)坑,坑了好久。

廢話不多說,進(jìn)入正題。

python MD5加密方法

import hashlib   //導(dǎo)入hash庫(kù)函數(shù)
text = "bolg.csdn.net"   //要加密的文本
md5_object = hashlib.md5()   //創(chuàng)建一個(gè)MD5對(duì)象
md5_object.update(text)   //添加去要加密的文本
print md5_object.hexdigest()  //輸出加密后的MD5值

坑在哪?

當(dāng)你在進(jìn)行第一次加密時(shí),程序正常輸出MD5值,但是在同一程序中進(jìn)行第二次明文加密時(shí),如果你的代碼是這樣寫,就不會(huì)得到正確的MD5值。

通過對(duì)第一張圖片和第二張圖片的比較,發(fā)現(xiàn)如果按照第一張圖片的代碼進(jìn)行連續(xù)加密時(shí),它實(shí)質(zhì)上是在加密每次明文的疊加。

即第一次加密:csdn

第二次加密:csdnblog

正確做法應(yīng)該是:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Python設(shè)計(jì)模式之工廠方法模式實(shí)例詳解

    Python設(shè)計(jì)模式之工廠方法模式實(shí)例詳解

    這篇文章主要介紹了Python設(shè)計(jì)模式之工廠方法模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了工廠方法模式的概念、原理、用法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類預(yù)測(cè)篇解讀

    Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類預(yù)測(cè)篇解讀

    這篇文章我們繼續(xù)學(xué)習(xí)一下GBDT模型的另一個(gè)進(jìn)化版本:LightGBM,LigthGBM是boosting集合模型中的新進(jìn)成員,由微軟提供,它和XGBoost一樣是對(duì)GBDT的高效實(shí)現(xiàn),原理上它和GBDT及XGBoost類似,都采用損失函數(shù)的負(fù)梯度作為當(dāng)前決策樹的殘差近似值,去擬合新的決策樹
    2022-01-01
  • 利用django-suit模板添加自定義的菜單、頁(yè)面及設(shè)置訪問權(quán)限

    利用django-suit模板添加自定義的菜單、頁(yè)面及設(shè)置訪問權(quán)限

    這篇文章主要給大家介紹了關(guān)于利用django-suit模板添加自定義的菜單、頁(yè)面及設(shè)置訪問權(quán)限的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧
    2018-07-07
  • 關(guān)于python time庫(kù)整理匯總

    關(guān)于python time庫(kù)整理匯總

    這篇文章主要給大家分享的是關(guān)于python time庫(kù)的整理,下面文章會(huì)介Time庫(kù)的作用,Time庫(kù)的使用及案列介紹,感興趣的小伙伴請(qǐng)和小拜年一起來閱讀下文吧
    2021-09-09
  • python獲取命令行參數(shù)實(shí)例方法講解

    python獲取命令行參數(shù)實(shí)例方法講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python獲取命令行參數(shù)實(shí)例方法講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • 詳解Python+Matplotlib繪制面積圖&熱力圖

    詳解Python+Matplotlib繪制面積圖&熱力圖

    這篇文章主要介紹了如何利用Python+Matplotlib繪制面積圖喝熱力圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-04-04
  • Python通過90行代碼搭建一個(gè)音樂搜索工具

    Python通過90行代碼搭建一個(gè)音樂搜索工具

    這篇文章主要介紹了Python通過90行代碼搭建一個(gè)音樂搜索工具,需要的朋友可以參考下
    2015-07-07
  • Pytorch如何加載自己的數(shù)據(jù)集(使用DataLoader讀取Dataset)

    Pytorch如何加載自己的數(shù)據(jù)集(使用DataLoader讀取Dataset)

    這篇文章主要介紹了Pytorch如何加載自己的數(shù)據(jù)集(使用DataLoader讀取Dataset)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 十分鐘輕松掌握dataframe數(shù)據(jù)選擇

    十分鐘輕松掌握dataframe數(shù)據(jù)選擇

    這篇文章主要介紹了十分鐘輕松掌握dataframe數(shù)據(jù)選擇,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • matplotlib之Pyplot模塊繪制三維散點(diǎn)圖使用顏色表示數(shù)值大小

    matplotlib之Pyplot模塊繪制三維散點(diǎn)圖使用顏色表示數(shù)值大小

    在撰寫論文時(shí)常常會(huì)用到matplotlib來繪制三維散點(diǎn)圖,下面這篇文章主要給大家介紹了關(guān)于matplotlib之Pyplot模塊繪制三維散點(diǎn)圖使用顏色表示數(shù)值大小的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評(píng)論