Некоторое время назад я прошел собеседование и был озадачен техническим вопросом. Задача, которую нужно решить, была дана методом хеширования ниже, напишите соответствующий метод хеширования.

    static Int64 hashThis (String s)
    {
        Int64 h = 7;
        String letters = "acdegiklmnoprsuw";

        for (Int32 i = 0; i < s.Length; i++)
        {
            h = (h * 37 + letters.IndexOf(s[i]));
        }

        return h;
    }

Мой неудачный прогресс до сих пор заключается в следующем:

static String unhashThis(Int64 integer)
    {
        Int64 h = 7;
        String letters = "acdegiklmnoprsuw";
        String unhashed = "";

        // as long as h < than integer passed in
        // this is so we iterate the correct number of times
        for (Int32 i = 0; h < integer; i++)
        {
            h = (h * 37 + letters.IndexOf(letters[i]));
            Int64 rem = h % 7;
            Int64 rem2 = 7 % h;
            //unhashed += letters[(int)h];
            //if (h > letters.Length)
            //{
            //    // loop through the letters to find the character
            //    for (int j = 0; j < h; j++)
            //    {
            //        if (j == letters.Length)
            //        {
            //            j = 0;
            //        }
            //        else
            //        {
            //            unhashed += letters[j];
            //        }
            //    }
            //}
        }

        return unhashed;

Просто чтобы повторить, я возвращаюсь к этому, поскольку я пытаюсь лучше справляться с решением проблем, чтобы я мог лучше справляться с будущими собеседованиями.

1
Robert Maziar 29 Апр 2020 в 17:39

2 ответа

Лучший ответ

Это работает:

static String unHashThis(Int64 hash)
{
    String letters = "acdegiklmnoprsuw";
    String phrase = "";
    while (hash >= 7 * 37)
    {
        int i = (int)(hash % 37);
        phrase = letters[i]+phrase;
        hash = (hash - hash % 37) / 37;
    }

    return phrase;
}

Примечания:

Во-первых, если строка, которую вы используете для хеширования и ее хэширования, содержит символы, которых нет в строке «букв», произойдет сбой

Попробуй понять, почему это работает, если не можешь, скажи мне, и я объясню

Это ближе к шифрованию, чем к хешированию. Полагаю, хеш не предназначен для хеширования.

0
Jose Ignacio Villaluenga 29 Апр 2020 в 16:24

Хороший вопрос Вот версия Python, которая также обрабатывает символы, отсутствующие в letters. Он использует тот факт, что find возвращает -1 , когда строка не найдена (как IndexOf в C #):

C = 37  # must be > len(letters)
letters = "cdategiorkswlm"


def hash_this(s):
    h = 7
    for ch in s:
        h = h * C + letters.find(ch)
    return h;


def unhash_this(v):
    h = 7
    s = ''
    while v > h:
        j = int(v % C)
        if j >= len(letters):
            j = -1
        v = (v - j) // C
        s += '_' if j == -1 else letters[j]
    return s[::-1]
hash_this('stackoverflow')
# 402116075536062288302

unhash_this(hash_this('stackoverflow'))
# 'stacko_er_low'
0
amain 29 Апр 2020 в 17:28