ΠΠΎΠ΄ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠΌ Π·Π΄Π΅ΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΡΡ Π½Π°Π±ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠΎΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ. ΠΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· Python (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, len(a) Π΄Π°Π΅Ρ Π΄Π»ΠΈΠ½Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ), Π½ΠΎ ΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° Π½Π° C (PySequence_Length()).
ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ
ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π²ΡΡΡΠΎΠΈΡΡ Python Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΡΠ°ΡΡΠΎ, ΡΠΎ Π΅Π³ΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΡΡΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π½Π° C/C++ - Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½Π°Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Python Π±ΡΠ» Π½Π°ΡΠ΅Π»Π΅Π½ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ C/C++-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ Python.
ΠΡΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ Python, Ρ ΠΎΡΡ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°, Π²ΡΠ΅ ΠΆΠ΅ ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ²ΠΎΡΡΠ΅ΡΠΊΠΈΠΉ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π² Python, Π΅Π΅ ΠΏΡΠΈΠ²ΡΠ·ΠΊΡ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Ρ ΠΎΠ΄Π΅ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎβΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π½Π°Π΄ΡΡΡΠΎΠΉΠΊΠ° ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ Π²ΡΠ΄Π΅ΡΠΆΠΊΡ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠ΄ΡΠ»Ρ md5, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ md5βΠ΄Π°ΠΉΠ΄ΠΆΠ΅ΡΡΠ°. ΠΠΎΠ΄ΡΠ»Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ΅Π»ΡΡ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ (ΡΠΎ Π΅ΡΡΡ, Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡΠΌΠΈ). ΠΠΎΠ΄ΡΠ»Ρ Π²Π²ΠΎΠ΄ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ , MD5Type, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π½ΠΎ ΠΈ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. Π ΡΠ°ΠΌΠΊΠ°Ρ ΡΡΠΎΠ³ΠΎ ΠΊΡΡΡΠ° Π½Π΅ ΠΈΠ·ΡΡΠΈΡΡ Π²ΡΠ΅ ΡΠΎΠ½ΠΊΠΎΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΏΠΎΠ½ΡΡΡ Π΄ΡΡ ΡΡΠΎΠ³ΠΎ Π·Π°Π½ΡΡΠΈΡ. ΠΠ° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π°Π²ΡΠΎΡΠ° ΠΊΡΡΡΠ° Π»Π΅ΠΊΡΠΈΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΡΠ»ΡΡ //:
// Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
#include "Python.h"
#include "md5.h"
// Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ md5.h Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ:
// typedef unsigned char *POINTER;
// typedef unsigned int UINT4;
// typedef struct {
// UINT4 state[4]; /* state (ABCD) */
// UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
// unsigned char buffer[64]; /* input buffer */
// } MD5_CTX;
// Π‘ΡΡΡΠΊΡΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° MD5type
typedef struct {
PyObject_HEAD
MD5_CTX md5; /* the context holder */
} md5object;
// ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° MD5type
static PyTypeObject MD5type;
// ΠΠ°ΠΊΡΠΎΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΈΠΏΠ° MD5type
#define is_md5object(v) ((v)->ob_type == &MD5type)
// ΠΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° MD5type
static md5object * newmd5object(void) {
md5object *md5p;
md5p = PyObject_New(md5object, &MD5type);
if (md5p == NULL)
return NULL; // Π½Π΅ Ρ Π²Π°ΡΠΈΠ»ΠΎ ΠΏΠ°ΠΌΡΡΠΈ
MD5Init(&md5p->md5); // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
return md5p;
}
// ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
// ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ·βΠΏΠΎΠ΄ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
static void md5_dealloc(md5object *md5p) { PyObject_Del(md5p); }
static PyObject * md5_update(md5object *self, PyObject *args) {
unsigned char *cp;
int len;
// ΡΠ°Π·Π±ΠΎΡ ΡΡΡΠΎΠΊΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². Π€ΠΎΡΠΌΠ°Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
// s# - ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΡΡΡΠΎΠΊΠ° (Π·Π°Π΄Π°Π½Π½Π°Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ ΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ)
// : - ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ
// update β Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π°
if (!PyArg_ParseTuple(args, "s#:update", &cp, &len))
return NULL;
MD5Update(&self->md5, cp, len);
// ΠΠ°ΠΆΠ΅ Π²ΠΎΠ·Π²ΡΠ°Ρ None ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΡΡΠ»ΠΎΠΊ
Py_INCREF(Py_None);
return Py_None;
}
// Π‘ΡΡΠΎΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° update
PyDoc_STRVAR(update_doc,
"update (arg)\n\
\n\
Update the md5 object with the string arg. Repeated calls are\n\
equivalent to a single call with the concatenation of all the\n\
arguments.");
// ΠΠ΅ΡΠΎΠ΄ digest
static PyObject * md5_digest(md5object *self) {
MD5_CTX mdContext;
unsigned char aDigest[16];
/* make a temporary copy, and perform the final */
mdContext = self->md5;
MD5Final(aDigest, &mdContext);
// ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊΠΈ
return PyString_FromStringAndSize((char *)aDigest, 16);
}
// ΠΈ ΡΡΡΠΎΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
PyDoc_STRVAR(digest_doc, "digest() -> string\n\ ...");
static PyObject * md5_hexdigest(md5object *self) {
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π° C
}
PyDoc_STRVAR(hexdigest_doc, "hexdigest() -> string\n...");
// ΠΠ΄Π΅ΡΡ Π±ΡΠ»ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° copy()
// ΠΠ΅ΡΠΎΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΡΠ±ΠΎΡΠ΅.
// ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΈΠΌΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π° C
// (Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ΡΠΈΠΏΡ PyCFunction), ΡΠΏΠΎΡΠΎΠ± ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²:
// METH_VARARGS (ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»βΠ²ΠΎ) ΠΈΠ»ΠΈ METH_NOARGS (Π½Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²)
// Π ΠΊΠΎΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° β ΠΌΠ΅ΡΠΊΠ° ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΡΠΏΠΈcΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
static PyMethodDef md5_methods[] = {
{"update", (PyCFunction)md5_update, METH_VARARGS, update_doc},
{"digest", (PyCFunction)md5_digest, METH_NOARGS, digest_doc},
{"hexdigest", (PyCFunction)md5_hexdigest, METH_NOARGS, hexdigest_doc},
{"copy", (PyCFunction)md5_copy, METH_NOARGS, copy_doc},
{NULL, NULL} /* sentinel */
};
// ΠΡΡΠΈΠ±ΡΡΡ md5βΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡ ΠΌΠ΅ΡΠΎΠ΄
// getattr.
static PyObject * md5_getattr(md5object *self, char *name) {
// Π°ΡΡΠΈΠ±ΡΡβΠ΄Π°Π½Π½ΠΎΠ΅ digest_size
if (strcmp(name, "digest_size") == 0) {
return PyInt_FromLong(16);
}
// ΠΏΠΎΠΈΡΠΊ Π°ΡΡΠΈΠ±ΡΡΠ°βΠΌΠ΅ΡΠΎΠ΄Π° Π²Π΅Π΄Π΅ΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅
return Py_FindMethod(md5_methods, (PyObject *)self, name);
}
// Π‘ΡΡΠΎΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ ΠΌΠΎΠ΄ΡΠ»Ρ md5
PyDoc_STRVAR(module_doc, "This module implements ...");
// Π‘ΡΡΠΎΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ ΠΊΠ»Π°ΡΡΡ md5
PyDoc_STRVAR(md5type_doc, "An md5 represents the object...");
// Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° MD5type Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠΌΠΈ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°
static PyTypeObject MD5type = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"md5.md5", /*tp_name*/
sizeof(md5object), /*tp_size*/
0, /*tp_itemsize*/
/* methods */
(destructor)md5_dealloc, /*tp_dealloc*/
0, /*tp_print*/
(getattrfunc)md5_getattr, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash*/
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
0, /*tp_xxx4*/
md5type_doc, /*tp_doc*/
};
// Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ md5:
// Π€ΡΠ½ΠΊΡΠΈΡ new() Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° md5type
static PyObject * MD5_new(PyObject *self, PyObject *args) {
md5object *md5p;
unsigned char *cp = NULL;
int len = 0;
// Π Π°Π·Π±ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΠ΄Π΅ΡΡ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½Π°Ρ ΡΠ΅ΡΡΠ°
// Π² ΡΡΡΠΎΠΊΠ΅ ΡΠΎΡΠΌΠ°ΡΠ° ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠ΅
// ΡΠΏΠΈΡΠΊΠ° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
// ΠΡΡΠ°Π»ΡΠ½ΠΎΠ΅ β ΠΊΠ°ΠΊ ΠΈ Π²ΡΡΠ΅: s# - ΡΡΡΠΎΠΊΠ°, ΠΏΠΎΡΠ»Π΅ : β ΠΈΠΌΡ
if (!PyArg_ParseTuple(args, "|s#:new", &cp, &len))
return NULL;
if ((md5p = newmd5object()) == NULL)
return NULL;
// ΠΡΠ»ΠΈ Π±ΡΠ» Π·Π°Π΄Π°Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ cp:
if (cp)
MD5Update(&md5p->md5, cp, len);
return (PyObject *)md5p;
}
// Π‘ΡΡΠΎΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ new()
PyDoc_STRVAR(new_doc, "new([arg]) -> md5 object ...");
// Π‘ΠΏΠΈΡΠΎΠΊ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ
static PyMethodDef md5_functions[] = {
{"new", (PyCFunction)MD5_new, METH_VARARGS, new_doc},
{"md5", (PyCFunction)MD5_new, METH_VARARGS, new_doc},
{NULL, NULL} /* Sentinel */
};
// Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ md5 β ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ new. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π΄Π»Ρ
// ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΡΠΎ ΡΡΠ°ΡΡΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ md5
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ
PyMODINIT_FUNC initmd5(void) {
PyObject *m, *d;
MD5type.ob_type = &PyType_Type;
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ
m = Py_InitModule3("md5", md5_functions, module_doc);
// ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ»ΠΎΠ²Π°ΡΡ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ
d = PyModule_GetDict(m);
// ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π°ΡΡΠΈΠ±ΡΡ MD5Type (ΡΠΈΠΏ md5βΠΎΠ±ΡΠ΅ΠΊΡΠ°) ΠΊ ΡΠ»ΠΎΠ²Π°ΡΡ
PyDict_SetItemString(d, "MD5Type", (PyObject *)&MD5type);
// ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π»Π°Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° digest_size ΠΊ ΠΌΠΎΠ΄ΡΠ»Ρ
PyModule_AddIntConstant(m, "digest_size", 16);
}
ΠΠ° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠΎΠΈΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ²ΡΠΈΡΡ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ C/API ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠΌ Β«Extending and EmbeddingΒ» (Β«Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΡΡΠ°ΠΈΠ²Π°Π½ΠΈΠ΅Β») ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ Python. ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΈΡΡΡΠΏΠ°ΡΡ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ΅Π»Π΅ΡΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ: ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ Π΅ΡΠ΅ Π½Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΎ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΈΡΡΠΎΠ³ΠΎ Python Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°. ΠΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² ΠΏΠΎΡΡΠ°Π²ΠΊΡ Python. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ²ΡΠ·Π°ΡΡΡΡ Ρ ΠΊΠ΅ΠΌβΠ½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ· ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΠΎ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΡΡΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π² Π²ΠΈΠ΄Π΅ Β«ΠΏΠ°ΡΡΠ°Β» ΡΠ΅ΡΠ΅Π· http://sourceforge.net.
ΠΡΠΈΠΌΠ΅Ρ Π²ΡΡΡΠ°ΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° C
ΠΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Python ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° C Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ C API. ΠΡΠΎ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ: