Реализация GetHashCode на основе строки подключения

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

Задача компилятора - обеспечить как можно большую гибкость, уменьшая сложность и риск непредвиденных побочных эффектов.

1
задан DonaldRay 10 August 2010 в 18:31
поделиться

3 ответа

Определите каноническую строку подключения и вызовите GetHashCode для этой строки. В этом случае вы можете определить «Provider = Microsoft.ACE.OLEDB.12.0; Data Source = path» как свою каноническую форму, а затем вам нужно будет преобразовать все эквивалентные строки подключения в каноническую строку, а затем вызвать GetHashCode.

Тогда возникает вопрос: насколько сложно превратить все эквивалентные строки подключения в одну и ту же строку?

2
ответ дан 2 September 2019 в 22:17
поделиться

Очень сложно, если не невозможно, определить, равны ли строки подключения. Единственное предположение, которое вы можете сделать, это то, что если строки равны, то и строки подключения равны.

Например - «.» может быть равно "localhost". Или localhost может иметь запись в файле hosts, переопределяющую его. Для некоторых будущих версий платформы может потребоваться символ ";" в конце строки ... две версии драйвера могут быть функционально эквивалентными, но вы относитесь к ним по-разному ... когда вы проводите линию, это очень нестабильный вопрос.

Моя точка зрения: Если вы не используете класс, который определяет каждый конкретный компонент строки подключения, вам не нужно решать, равны ли две строки подключения, помимо сравнения строк.

0
ответ дан 2 September 2019 в 22:17
поделиться

Я решил эту проблему на основе данных обоих ответов:

Определите каноническую строку подключения

И

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

Итак, я создал метод расширения для OleDbConnectionStringBuilder:

public static int GetRealHashCode(this OleDbConnectionStringBuilder target)
{
    int ToReturn = 17;
    ToReturn *= target.DataSource.TrimEnd(';').GetHashCode();
    ToReturn *= target.Provider.TrimEnd(';').GetHashCode();
    ToReturn *= target.PersistSecurityInfo.ToString().GetHashCode();

    var OrderedKeys = from string key in target.Keys
              orderby key
              select key;
    foreach (string Key in OrderedKeys)
        ToReturn *= target[Key].GetHashCode();

    return ToReturn;
}
0
ответ дан 2 September 2019 в 22:17
поделиться
Другие вопросы по тегам:

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