ultraopt.utils.hash 源代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : qichun tang
# @Date    : 2020-12-15
# @Contact    : qichun.tang@bupt.edu.cn
import hashlib
from copy import deepcopy
from typing import Union, Dict, Any

import numpy as np
from ConfigSpace import Configuration
from scipy.sparse import issparse


[文档]def get_hash_of_array(X, m=None): if m is None: m = hashlib.md5() if issparse(X): m.update(X.indices) m.update(X.indptr) m.update(X.data) m.update(str(X.shape).encode('utf8')) else: if X.flags['C_CONTIGUOUS']: m.update(X.data) m.update(str(X.shape).encode('utf8')) else: X_tmp = np.ascontiguousarray(X.T) m.update(X_tmp.data) m.update(str(X_tmp.shape).encode('utf8')) hash = m.hexdigest() return hash
[文档]def sort_dict(obj): if isinstance(obj, dict): for k, v in obj.items(): obj[k] = sort_dict(v) return dict(sorted(obj.items(), key=lambda x: str(x[0]))) elif isinstance(obj, list): for i, elem in enumerate(obj): obj[i] = sort_dict(elem) return list(sorted(obj, key=str)) else: return obj
[文档]def get_hash_of_dict(dict_, m=None): if m is None: m = hashlib.md5() sorted_dict = sort_dict(deepcopy(dict_)) # sorted_dict = deepcopy(dict_) m.update(str(sorted_dict).encode("utf-8")) return m.hexdigest()
[文档]def get_hash_of_config(config: Union[Configuration, Dict[str, Any]], m=None): if m is None: m = hashlib.md5() assert isinstance(config, (dict, Configuration)) if isinstance(config, Configuration): config = config.get_dictionary() return get_hash_of_dict(config, m)