Написание метода UnHa sh, основанного на следующем методе Ha sh - PullRequest
1 голос
/ 29 апреля 2020

Когда-то go я прошел собеседование и был озадачен техническим вопросом. Задача, которую нужно решить, дана методом ha sh ниже, напишите соответствующий метод unha sh.

    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;

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

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Хороший вопрос. Вот версия 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 голосов
/ 29 апреля 2020

это работает:

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;
}

Примечания:

Сначала, если строка, которую вы используете для ha sh и unha sh, это символы, которые не в буквах " "строка, она потерпит неудачу

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

Это ближе к шифрованию, чем к Хешированию, я считаю, Ха sh не предназначено для ООН-Ха sh

...