Guid.NewGuid().GetHashCode() для БД

Будет ли это надежным для использования в качестве идентификатора для хранилища данных (SQL Server)?

Я бы использовал руководство, но предпочитаю числовое значение.


person Tomasi    schedule 23.02.2010    source источник
comment
Единственное число, которое вы получите, которое квалифицируется как ключ, — это идентификатор или поле, подобное идентификатору. хэширование путеводителя похоже на игру в лотерею с вашими ключами в том смысле, что шансы на «выигрыш» невелики и в отличие от лотереи в том, что вы не будете счастливы, когда вы сделаете это, потому что вы, вероятно, не будете знать об этом, вы будете слишком заняты погоней за жук-призрак.   -  person Sky Sanders    schedule 23.02.2010


Ответы (7)


Будет ли это надежным для использования в качестве идентификатора для хранилища данных (SQL Server)?

Нет. GUID — 128-битные, а хэш-коды — 32-битные. Поэтому обязательно происходят столкновения. Маловероятно, что вы когда-нибудь столкнетесь с ним, но нет гарантии, что вы никогда с ним не столкнетесь.

Что вам нужно для надежности, так это гарантия того, что вы никогда не столкнетесь с конфликтом. Если вы настаиваете на использовании Guid.NewGuid().GetHashCode(), вам нужно добавить логику для обнаружения коллизий. У GUID есть преимущества (и недостатки), но без дополнительной информации я бы предложил использовать автоинкрементный столбец int. Тем более, что вы говорите, что вам нужен числовой столбец, я бы склонялся к использованию IDENTITY.

person jason    schedule 23.02.2010

guid с большей вероятностью представляет запись уникально, чем numeric value.

Вместе с:

  • GUID обеспечивают глобальную уникальность
  • GUID можно легко перемещать между базами данных
  • GUID уменьшают количество необходимых объединений

См. это: Первичный ключ Guid или Int?

person Asad    schedule 23.02.2010

Настоящий GUID должен быть уникальным. Когда вы уменьшаете это до int (через GetHashCode), вероятность его уникальности уменьшается.

Есть одна веская причина для использования GUID (уникальность), и этот код удаляет эту функцию GUID.

person Arve    schedule 23.02.2010
comment
Автоинкрементные int тоже уникальны, поэтому просто говорить то же самое о GUID недостаточно. - person jason; 23.02.2010
comment
Правда, и автоинкрементный int тоже уникален. Но для этого требуется получить уникальный int из какого-то центрального места. Особенность GUID заключается в том, что я могу получить новый GUID без проверки в каком-то центральном месте, и он будет уникальным. - person Arve; 23.02.2010

Если вам нужно числовое значение, используйте столбец IDENTITY. Если вам нужен GUID, используйте uniqueidentifier. Просто как тот.

Не пытайтесь смешивать и сочетать. Не хэшируйте GUID, чтобы получить числовое значение. Это оставит вас со всеми недостатками столбца GUID (большие данные/индексы, разделение страниц) и сведет на нет большинство преимуществ (фактическая уникальность, поддержка репликации). Кроме того, вы не получаете никаких преимуществ, которые дает последовательный числовой идентификатор, таких как временное упорядочение и производительность индекса.

person Aaronaught    schedule 23.02.2010

Я бы сказал, просто используйте GUID в качестве значения столбца. Тогда никаких вопросов.

person Preet Sangha    schedule 23.02.2010

Dim bom As New Dictionary(Of Long, Boolean)

Sub pageload() Handles Me.Load
    For i = 0 To 500
        Dim act As New Action(AddressOf collisionfind)
        act.BeginInvoke(Nothing, Nothing)
    Next
End Sub

Sub collisionfind()
    For index = 1 To 50000000
        Dim INTGUID = Guid.NewGuid.GetHashCode / 2 * Guid.NewGuid.GetHashCode / 2
        bom.Add(INTGUID, Nothing)
    Next
End Sub

Ну, я думаю, в конце концов, это почти так же хорошо.

Никаких столкновений :D.

50000000 циклов на 500 потоков — это довольно тяжело. Мне этого достаточно.

person Tomasi    schedule 23.02.2010

Это распространенный подход, и я сразу же назову одну вескую причину, по которой стоит пойти по этому пути. Вы можете сгенерировать GUID до того, как попадете в БД, чтобы вы могли выполнить, скажем, вставку асинхронно, и заранее знали, каким будет идентификатор.

Убедитесь, что тип данных вашего первичного ключа имеет тип UNIQUEIDENTIFIER, и все готово.

person used2could    schedule 23.02.2010