У нас есть старый, нестандартный C# алгоритм хэширования, который мы используем для маскировки адресов электронной почты в целях PII. Я пытаюсь построить Python версию этого алгоритма, но я изо всех сил пытаюсь справиться с различиями в том, как C# и Python обрабатывают байты / байтовые массивы, создавая, таким образом, неправильное значение ha sh. Для справки: Python 2,7, но решение Python 3+ будет работать так же хорошо.
C# код:
using System.Text;
using System.Security;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
string emailAddressStr = "my@email.com";
emailAddressStr = emailAddressStr.Trim().ToLower();
SHA256 objCrypt = new SHA256Managed();
byte[] b = (new ASCIIEncoding()).GetBytes(emailAddressStr);
byte[] bRet = objCrypt.ComputeHash(b);
string retStr = "";
byte c;
for (int i = 0; i < bRet.Length; i++)
{
c = (byte)bRet[i];
retStr += ((char)(c / 10 + 97)).ToString().ToLower();
retStr += ((char)(c % 10 + 97)).ToString().ToLower();
}
Console.WriteLine(retStr);
}
}
(правильное) значение, которое возвращается uhgbnaijlgchcfqcrgpicdvczapepbtifiwagitbecjfqalhufudieofyfdhzera
Python перевод:
import hashlib
emltst = "my@email.com"
emltst = emltst.strip().lower()
b = bytearray(bytes(emltst).encode("ascii"))
bRet = bytearray(bytes(hashlib.sha256(b)))
emailhash=""
for i in bRet:
c = bytes(i)
emailhash = emailhash + str(chr((i / 10) + 97)).lower()
emailhash = emailhash + str(chr((i % 10) + 97)).lower()
print(emailhash)
(неправильное) значение, которое я здесь получаю, galfkejhfafdfedchcgfidhcdclbjikgkbjjlgdcgedceimaejeifakajhfekceifggc
«бизнес-конец» код в l oop, где c
плохо переводит между языками. C# создает числовое значение c для расчета, но в Python, c
- это строка (поэтому я использую i
). Я прошел через оба набора кода и знаю, что я получаю одинаковое значение ha sh прямо перед l oop. Я надеюсь, что кто-то здесь сможет мне помочь. TIA!
EDIT (2020-04-09)
Oguz Ozgul предлагает хорошее решение ниже. На работе я нашел опытного программиста, который предложил это рабочее решение Python 3 (оно содержит код для более широкого решения по составлению списка электронных писем и использованию PySpark для написания таблицы):
myfile=sys.argv[1]
with open(myfile) as fql:
insql=fql.read()
emails=[]
emails=insql.splitlines()
mytable=sys.argv[2]
def getSha256Hash(email):
b = bytearray(bytes(email, 'ascii'))
res = hashlib.sha256(b)
bRet = bytearray.fromhex(res.hexdigest())
emailhash=""
for i in bRet:
c1 = i / 10 + 97
c2 = i % 10 + 97
c1 = int(c1)
c2 = int(c2)
emailhash = emailhash + str(chr(c1)).lower()
emailhash = emailhash + str(chr(c2)).lower()
return(emailhash)
###################################
emailhashes = []
isascii = lambda s: len(s) == len(s.encode())
for e in emails:
e = e.strip().lower()
if isascii(e) == True:
emailhashret = getSha256Hash(e)
emailhashes.append(emailhashret)
findf = spark.createDataFrame(emailhashes, StringType())
spark.sql("SET spark.sql.hive.convertMetastoreParquet=false")
findf.repartition(1).write.format("parquet").mode("overwrite").saveAsTable(mytable)