Как хешировать большой объект (набор данных) в Python?

Извините, мой плохой английский. Я надеюсь помочь:

var uploadedFile = Request.Files[0]; //Get file
var fileName = Path.GetFileName(uploadedFile.FileName);  //get file name
string fileSavePath = Server.MapPath(fileName); //get path
uploadedFile.SaveAs(fileSavePath); //saving file
FileInfo info = new FileInfo(fileSavePath);//get info file
//the problem ocurred because this, 
FileStream s = new FileStream(fileSavePath, FileMode.Open); //openning stream, them file in use by a process
System.IO.File.Delete(fileSavePath); //Generete a error
//problem solved here...
s.Close();
s.Dispose();
System.IO.File.Delete(fileSavePath); //File deletad sucessfully!
25
задан SilentGhost 30 April 2009 в 09:54
поделиться

4 ответа

Вот как я делаю это в кувшине (git HEAD во время этого ответа):

e = some_array_object
M = hashlib.md5()
M.update('np.ndarray')
M.update(pickle.dumps(e.dtype))
M.update(pickle.dumps(e.shape))
try:
    buffer = e.data
    M.update(buffer)
except:
    M.update(e.copy().data)

Причина в том, что e.data доступен только для некоторых массивов. (смежные массивы). То же самое с a.view(np.uint8) (который завершается ошибкой неописательного типа, если массив не является смежным).

2
ответ дан luispedro 15 October 2019 в 16:35
поделиться

Какой формат данных в массивах? Не могли бы вы просто перебрать массивы, преобразовать их в строку (с помощью некоторых воспроизводимых средств), а затем передать это в ваш хэш с помощью обновления?

Например,

import hashlib
m = hashlib.md5() # or sha1 etc
for value in array: # array contains the data
    m.update(str(value))

Не забывайте, что эти массивные массивы не будут обеспечивать __ hash __ () , потому что они изменчивы. Поэтому будьте осторожны, чтобы не изменять массивы после того, как вы вычислили ваш хэш (так как он больше не будет прежним).

3
ответ дан 28 November 2019 в 21:13
поделиться

Похоже, вы уже знакомы с некоторыми недостатками и преимуществами.

Некоторые другие: а) Позволяет поддерживать правильную оптимизацию хвостового вызова, даже если базовая реализация не поддерживает ее б) Легче создавать такие вещи, как языковой уровень "трассировки стека" в) Проще добавить правильные продолжения, как вы указали

. Недавно я написал простой интерпретатор «Схемы» на C #, который изначально использовал стек .NET. Затем я переписал его для использования явного стека - так что, возможно, вам поможет следующее:

Первая версия использовала неявный стек времени выполнения .NET ...

Изначально это была просто иерархия классов с различными формы (Lambda, Let и т. д.) являются реализациями следующего интерфейса:

// A "form" is an expression that can be evaluted with
// respect to an environment
// e.g.
// "(* x 3)"
// "x"
// "3"
public interface IForm
{
    object Evaluate(IEnvironment environment);
}

IEnvironment выглядел так, как вы ожидаете:

/// <summary>
/// Fundamental interface for resolving "symbols" subject to scoping.
/// </summary>
public interface IEnvironment
{
    object Lookup(string name);
    IEnvironment Extend(string name, object value);
}

Для добавления «встроенных» в мой интерпретатор Scheme у меня изначально был следующий интерфейс:

/// <summary>
/// A function is either a builtin function (i.e. implemented directly in CSharp)
/// or something that's been created by the Lambda form.
/// </summary>
public interface IFunction
{
    object Invoke(object[] args);
}

Это было, когда он использовал неявный стек времени выполнения .NET. Определенно было меньше кода, но было невозможно добавить такие вещи, как правильная хвостовая рекурсия, и, самое главное, моему интерпретатору было неловко предоставить " и я думаю, что у него меньше издержек, чем при преобразовании каждого числа в, возможно, огромных массивах в строки:

Я могу создать байтовое представление массивов и использовать их для обновления хэша. И почему-то это дает тот же дайджест, что и прямое обновление с использованием массива:

>>> import hashlib
>>> import numpy
>>> a = numpy.random.rand(10, 100)
>>> b = a.view(numpy.uint8)
>>> print a.dtype, b.dtype # a and b have a different data type
float64 uint8
>>> hashlib.sha1(a).hexdigest() # byte view sha1
'794de7b1316b38d989a9040e6e26b9256ca3b5eb'
>>> hashlib.sha1(b).hexdigest() # array sha1
'794de7b1316b38d989a9040e6e26b9256ca3b5eb'
29
ответ дан 28 November 2019 в 21:13
поделиться

array.data всегда хэшируемый, потому что это буферный объект. легко :) (если вас не заботит разница между массивами разной формы с точно такими же данными и т. д. (т.е. это подходит, если только shape, byteorder и другие «параметры» массива также не должны фигурировать в хэше)

1
ответ дан 28 November 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: